MeUtils 2025.1.17.19.49.29__py3-none-any.whl → 2025.1.27.15.5.31__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 (47) hide show
  1. {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/METADATA +27 -28
  2. {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/RECORD +46 -43
  3. examples/_openaisdk/4v.py +3 -4
  4. examples/_openaisdk/openai_baichuan.py +7 -3
  5. examples/_openaisdk/openai_chatfire.py +17 -4
  6. examples/_openaisdk/openai_deepinfra.py +2 -2
  7. examples/_openaisdk/openai_deepseek.py +7 -6
  8. examples/_openaisdk/openai_doubao.py +16 -7
  9. examples/_openaisdk/openai_embeddings.py +1 -1
  10. examples/_openaisdk/openai_modelscope.py +2 -1
  11. examples/_openaisdk/openai_together.py +2 -1
  12. meutils/apis/jimeng/lip_sync.py → examples/_openaisdk/openai_x.py +3 -2
  13. examples/_openaisdk/openai_zhipu.py +9 -5
  14. examples/bserver.py +60 -518
  15. examples/json_jmespath.py +13 -13
  16. meutils/apis/fal/videos.py +13 -7
  17. meutils/apis/hailuoai/videos.py +16 -6
  18. meutils/apis/hunyuan/image_tools.py +6 -2
  19. meutils/apis/images/edits.py +74 -6
  20. meutils/apis/images/recraft.py +5 -5
  21. meutils/apis/jimeng/common.py +2 -147
  22. meutils/apis/jimeng/doubao.py +2 -2
  23. meutils/apis/jimeng/files.py +84 -29
  24. meutils/apis/jimeng/images.py +177 -11
  25. meutils/apis/jimeng/videos.py +305 -0
  26. meutils/apis/oneapi/user.py +3 -1
  27. meutils/data/VERSION +1 -1
  28. meutils/io/files_utils.py +9 -3
  29. meutils/jwt_utils/common.py +46 -0
  30. meutils/llm/clients.py +4 -1
  31. meutils/llm/completions/agents/file.py +7 -4
  32. meutils/llm/completions/agents/search.py +115 -0
  33. meutils/parsers/fileparser/mineru.py +48 -0
  34. meutils/schemas/hailuo_types.py +8 -2
  35. meutils/schemas/image_types.py +19 -5
  36. meutils/schemas/oneapi/common.py +152 -45
  37. meutils/schemas/oneapi/models.py +1 -1
  38. meutils/schemas/openai_types.py +1 -1
  39. meutils/schemas/task_types.py +2 -0
  40. meutils/schemas/video_types.py +19 -1
  41. meutils/str_utils/json_utils.py +29 -1
  42. meutils/request_utils/jwt_utils/common.py +0 -42
  43. {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/LICENSE +0 -0
  44. {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/WHEEL +0 -0
  45. {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/entry_points.txt +0 -0
  46. {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/top_level.txt +0 -0
  47. /meutils/{request_utils/jwt_utils → jwt_utils}/__init__.py +0 -0
@@ -0,0 +1,305 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : lip_sync
5
+ # @Time : 2025/1/3 16:17
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+ """
11
+ 1. 上传图片 image_to_avatar检测
12
+ 2. 上传视频 video_to_avatar检测
13
+ 3. 上传音频+创建任务
14
+
15
+ """
16
+ import asyncio
17
+
18
+ from meutils.pipe import *
19
+ from meutils.str_utils.json_utils import json_path
20
+
21
+ from meutils.schemas.jimeng_types import BASE_URL, MODELS_MAP, FEISHU_URL
22
+ from meutils.schemas.video_types import LipsyncVideoRquest
23
+ from meutils.schemas.task_types import TaskResponse
24
+ from meutils.apis.jimeng.common import get_headers, check_token
25
+ from meutils.apis.jimeng.files import upload_for_image, upload_for_video
26
+
27
+ from meutils.config_utils.lark_utils import get_next_token_for_polling
28
+
29
+ from fake_useragent import UserAgent
30
+
31
+ ua = UserAgent()
32
+
33
+
34
+ async def create_realman_avatar(image_url: str, token: str):
35
+ if image_url.startswith("http"):
36
+ image_url = await upload_for_image(image_url, token)
37
+
38
+ url = "/mweb/v1/create_realman_avatar"
39
+ headers = get_headers(url, token)
40
+
41
+ payload = {
42
+ "input_list": [
43
+ {
44
+ "image_uri": image_url,
45
+ "submit_id": str(uuid.uuid4()),
46
+ "mode": 0
47
+ },
48
+ {
49
+ "image_uri": image_url,
50
+ "submit_id": str(uuid.uuid4()),
51
+ "mode": 1
52
+ }
53
+ ]
54
+ }
55
+
56
+ async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60) as client:
57
+ response = await client.post(url, json=payload)
58
+ response.raise_for_status()
59
+ data = response.json()
60
+ logger.debug(bjson(data)) # 1914628189186
61
+
62
+ response = TaskResponse(metadata=data, system_fingerprint=token)
63
+ if task_ids := json_path(data, "$..task_id"): # 返回 imageurl vid
64
+ response.task_id = ' '.join(task_ids)
65
+ return response
66
+
67
+ else:
68
+ response.message = str(json_path(data, "$..message"))
69
+ response.status = "fail"
70
+ return response
71
+
72
+
73
+ async def get_task(task_id: str, token: str = "916fed81175f5186a2c05375699ea40d"):
74
+ """
75
+ $..image_to_avatar 成功: 先检测图片or视频
76
+ :param task_ids:
77
+ :return:
78
+ """
79
+ task_ids = task_id.split()
80
+
81
+ url = "/mweb/v1/mget_generate_task"
82
+ headers = get_headers(url, token)
83
+
84
+ payload = {"task_id_list": task_ids}
85
+ async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60) as client:
86
+ response = await client.post(url, json=payload)
87
+ response.raise_for_status()
88
+ data = response.json()
89
+ logger.debug(bjson(data))
90
+
91
+ if json_path(data, "$..image_to_avatar"): # 角色检测 create_realman_avatar
92
+ resource_id_std = resource_id_loopy = ""
93
+ if resource_id_stds := json_path(data, "$..resource_id_std"):
94
+ resource_id_std = "".join(resource_id_stds)
95
+
96
+ if resource_id_loopys := json_path(data, "$..resource_id_loopy"):
97
+ resource_id_loopy = "".join(resource_id_loopys)
98
+
99
+ task_data = {
100
+ "resource_id_std": resource_id_std,
101
+ "resource_id_loopy": resource_id_loopy
102
+ }
103
+ response = TaskResponse(task_id=task_id, data=task_data, metadata=data)
104
+ if resource_id_std and resource_id_loopy:
105
+ response.status = "success"
106
+
107
+ if (message := json_path(data, "$..image_to_avatar.message")) and "fail" in str(message).lower():
108
+ response.message = str(message)
109
+ response.status = "fail"
110
+
111
+ return response
112
+
113
+ else:
114
+ response = TaskResponse(task_id=task_id, metadata=data)
115
+ if (message := json_path(data, "$..fail_msg")) and "success" not in str(message).lower():
116
+ response.message = str(message)
117
+ response.status = "fail"
118
+ return response
119
+
120
+ if will_cost := json_path(data, "$..will_cost"):
121
+ response.will_cost = will_cost[0]
122
+
123
+ if video_urls := json_path(data, "$..[360p,480p,720p].video_url"):
124
+ response.data = [{"video": _} for _ in video_urls]
125
+
126
+ return response
127
+
128
+
129
+ async def create_task(request: LipsyncVideoRquest, token: Optional[str] = None):
130
+ # token = token or await get_next_token_for_polling(FEISHU_URL, check_token)
131
+ token = "7c5e148d9fa858e3180c42f843c20454" # 年付
132
+ token = "916fed81175f5186a2c05375699ea40d" # 月付
133
+
134
+ url = "/mweb/v1/batch_generate_video"
135
+
136
+ headers = get_headers(url, token)
137
+
138
+ model = request.model
139
+ scene = "lip_sync_image"
140
+ image_url = await upload_for_image(request.image_url, token)
141
+
142
+ # 角色检测
143
+ realman_avatar_response = await create_realman_avatar(image_url, token)
144
+ if realman_avatar_response.status == "fail":
145
+ return realman_avatar_response
146
+
147
+ else:
148
+ for _ in range(10):
149
+ task_response = await get_task(realman_avatar_response.task_id, token)
150
+ if task_response.status == "fail":
151
+ logger.debug("fail")
152
+ return task_response
153
+ elif task_response.status == "success":
154
+ logger.debug("success")
155
+
156
+ realman_avatar_response = task_response
157
+ break
158
+ else:
159
+ await asyncio.sleep(3)
160
+ continue
161
+
162
+ audio_vid, audio_url = await upload_for_video(request.audio_url, token)
163
+
164
+ resource_id_std = realman_avatar_response.data.get("resource_id_std")
165
+ resource_id_loopy = realman_avatar_response.data.get("resource_id_loopy")
166
+
167
+ i2v_opt = v2v_opt = {}
168
+ if request.video_url:
169
+ v2v_opt = {}
170
+
171
+ # payload = {
172
+ # "submit_id": "",
173
+ # "task_extra": "{\"promptSource\":\"photo_lip_sync\",\"generateTimes\":1,\"lipSyncInfo\":{\"sourceType\":\"local-file\",\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\"},\"isUseAiGenPrompt\":false,\"batchNumber\":1}",
174
+ # "http_common_info": {
175
+ # "aid": 513695
176
+ # },
177
+ # "input": {
178
+ # "seed": 3112889115,
179
+ # "video_gen_inputs": [
180
+ # {
181
+ # "v2v_opt": {},
182
+ # "i2v_opt": {
183
+ # "realman_avatar": {
184
+ # "enable": True,
185
+ # "origin_image": {
186
+ # # "width": 800,
187
+ # # "height": 1200,
188
+ # "image_uri": "tos-cn-i-tb4s082cfz/4dead1bfc8e84572a91f2e047016a351",
189
+ # "image_url": ""
190
+ # },
191
+ # "origin_audio": {
192
+ # # "duration": 9.976625,
193
+ # "vid": "v02870g10004cu8d4r7og65j2vr5opb0"
194
+ # },
195
+ #
196
+ # "resource_id_std": "381c534f-bcef-482e-8f17-5b30b64e41a1",
197
+ # "resource_id_loopy": "b9ac51cb-e26c-4b63-81d9-34ed24053032",
198
+ # #
199
+ # # "tts_info": "{\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\",\"source_type\":\"local-file\"}"
200
+ # }
201
+ # },
202
+ # "audio_vid": "v02870g10004cu8d4r7og65j2vr5opb0",
203
+ # "video_mode": 4
204
+ # }
205
+ # ]
206
+ # },
207
+ # "mode": "workbench",
208
+ # "history_option": {},
209
+ # "commerce_info": {
210
+ # "resource_id": "generate_video",
211
+ # "resource_id_type": "str",
212
+ # "resource_sub_type": "aigc",
213
+ # "benefit_type": "lip_sync_avatar_std", # 5积分
214
+ # # "benefit_type": "lip_sync_avatar_lively" # 10积分
215
+ # },
216
+ # "scene": "lip_sync_image",
217
+ # "client_trace_data": {},
218
+ # "submit_id_list": [
219
+ # str(uuid.uuid4())
220
+ # ]
221
+ # }
222
+
223
+ if request.image_url:
224
+ i2v_opt = {
225
+ "realman_avatar": {
226
+ "enable": True,
227
+ "origin_image": {
228
+ "image_uri": image_url,
229
+ "image_url": ""
230
+ },
231
+ "resource_id_loopy": resource_id_loopy,
232
+ "resource_id_std": resource_id_std,
233
+ "origin_audio": {
234
+ "vid": audio_vid
235
+ },
236
+ # "tts_info": "{\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\",\"source_type\":\"local-file\"}"
237
+ }
238
+ }
239
+
240
+ payload = {
241
+ "submit_id": "",
242
+ # "task_extra": "{\"promptSource\":\"photo_lip_sync\",\"generateTimes\":1,\"lipSyncInfo\":{\"sourceType\":\"local-file\",\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\"},\"isUseAiGenPrompt\":false,\"batchNumber\":1}",
243
+ "http_common_info": {
244
+ "aid": 513695
245
+ },
246
+ "input": {
247
+ "seed": 2032846910,
248
+ "video_gen_inputs": [
249
+ {
250
+ "v2v_opt": v2v_opt,
251
+ "i2v_opt": i2v_opt,
252
+ "audio_vid": audio_vid,
253
+ "video_mode": 4
254
+ }
255
+ ]
256
+ },
257
+ "mode": "workbench",
258
+ "history_option": {},
259
+ "commerce_info": {
260
+ "resource_id": "generate_video",
261
+ "resource_id_type": "str",
262
+ "resource_sub_type": "aigc",
263
+ "benefit_type": model,
264
+ # "benefit_type": "lip_sync_avatar_lively" # 10积分
265
+ },
266
+ "scene": scene,
267
+ "client_trace_data": {},
268
+ "submit_id_list": [
269
+ str(uuid.uuid4())
270
+ ]
271
+ }
272
+
273
+ logger.debug(bjson(payload))
274
+
275
+ async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60) as client:
276
+ response = await client.post(url, json=payload)
277
+ response.raise_for_status()
278
+ data = response.json()
279
+ logger.debug(bjson(data))
280
+
281
+ if task_ids := json_path(data, "$..task.task_id"):
282
+ task_id = task_ids[0]
283
+ return TaskResponse(task_id=task_id, system_fingerprint=token)
284
+
285
+
286
+ if __name__ == '__main__':
287
+ token = "916fed81175f5186a2c05375699ea40d"
288
+
289
+ request = LipsyncVideoRquest(
290
+ model="lip_sync_avatar_std",
291
+ image_url="https://oss.ffire.cc/files/kling_watermark.png",
292
+ video_url="",
293
+ audio_url="https://oss.ffire.cc/files/lipsync.mp3"
294
+ )
295
+
296
+ # with timer():
297
+ # r = arun(create_realman_avatar(request.image_url, token))
298
+ # arun(get_task(r.task_id))
299
+
300
+ # image_uri = "tos-cn-i-tb4s082cfz/387649a361e546f89549bd3510ab926d"
301
+ # task_ids = arun(create_realman_avatar(image_uri, token="7c5e148d9fa858e3180c42f843c20454"))
302
+ # arun(mget_generate_task(task_ids))
303
+ with timer():
304
+ r = arun(create_task(request))
305
+ # arun(get_task(r.task_id))
@@ -20,6 +20,7 @@ token = os.environ.get("CHATFIRE_ONEAPI_TOKEN")
20
20
 
21
21
  headers = {
22
22
  "Authorization": f"Bearer {token}",
23
+ 'rix-api-user': '1'
23
24
  }
24
25
 
25
26
 
@@ -55,6 +56,7 @@ async def get_api_key_log(api_key: str) -> Optional[list]: # 日志查询会超
55
56
 
56
57
  @alru_cache(ttl=60)
57
58
  async def get_user(user_id):
59
+
58
60
  async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=30) as client:
59
61
  response = await client.get(f"/api/user/{user_id}")
60
62
  # logger.debug(response.text)
@@ -97,4 +99,4 @@ if __name__ == '__main__':
97
99
  # arun(put_user(payload, -1))
98
100
 
99
101
  # arun(get_api_key_log('sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv'))
100
- # arun(get_user_money("sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv"))
102
+ arun(get_user_money("sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv"))
meutils/data/VERSION CHANGED
@@ -1 +1 @@
1
- 2025.01.17.19.49.29
1
+ 2025.01.27.15.05.31
meutils/io/files_utils.py CHANGED
@@ -58,23 +58,29 @@ async def to_bytes(
58
58
  """
59
59
  # assert file
60
60
 
61
- logger.debug(type(file))
62
-
63
- if isinstance(file, bytes): return file
61
+ if isinstance(file, bytes):
62
+ logger.debug(f"FileType: BYTES")
63
+ return file
64
64
 
65
65
  file_bytes = None
66
66
  if isinstance(file, UploadFile):
67
67
  file_bytes = await file.read()
68
68
 
69
69
  elif isinstance(file, str) and file.startswith('http'): # url
70
+ logger.debug(f"FileType: HTTP")
71
+
70
72
  async with AsyncClient(headers=headers or {}, timeout=60) as cilent:
71
73
  resp = await cilent.get(file)
72
74
  file_bytes = resp.content
73
75
 
74
76
  elif isinstance(file, str) and len(file) > 256: # base64
77
+ logger.debug(f"FileType: BASE64")
78
+
75
79
  file_bytes = base64_to_bytes(file)
76
80
 
77
81
  elif isinstance(file, str) and len(file) < 256 and Path(file).is_file(): # file
82
+ logger.debug(f"FileType: PATH")
83
+
78
84
  file_bytes = Path(file).read_bytes()
79
85
 
80
86
  return file_bytes
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : common
5
+ # @Time : 2024/10/28 20:57
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+
13
+ import jwt
14
+ import time
15
+ import datetime
16
+
17
+ # Header and payload
18
+ header = {
19
+ "alg": "HS512",
20
+ "type": "JWT"
21
+ }
22
+
23
+
24
+ payload = {
25
+ "jti": "80004477",
26
+ "rol": "ROLE_REGISTER",
27
+ "iss": "OpenXLab",
28
+ "clientId": "lkzdx57nvy22jkpq9x2w",
29
+ "phone": "",
30
+ "uuid": "73a8d9b0-8bbf-4973-9b71-4b687ea23a78",
31
+ "email": "313303303@qq.com",
32
+
33
+ "iat": int(time.time()),
34
+ "exp": int(time.time()) + 3600
35
+ }
36
+
37
+ # Your secret key
38
+ secret = ""
39
+
40
+ # Create the JWT
41
+ token = jwt.encode(payload, secret, algorithm="HS512", headers=header)
42
+
43
+ print(token)
44
+
45
+
46
+
meutils/llm/clients.py CHANGED
@@ -32,7 +32,10 @@ if __name__ == '__main__':
32
32
 
33
33
  # web-search-pro
34
34
 
35
- arun(zhipuai_client.chat.completions.create(
35
+ r = arun(zhipuai_client.chat.completions.create(
36
36
  messages=[{"role": "user", "content": "中国队奥运会拿了多少奖牌"}],
37
37
  model='web-search-pro')
38
38
  )
39
+
40
+ r.model_dump_json()
41
+
@@ -13,6 +13,7 @@ api形式
13
13
  - /agents/v1
14
14
  - /v1 前缀区分 agents-{model}【底层调用 /agents/v1】
15
15
 
16
+ todo: 记录上下文日志
16
17
  """
17
18
 
18
19
  from meutils.pipe import *
@@ -88,16 +89,18 @@ if __name__ == '__main__':
88
89
 
89
90
  {
90
91
  'role': 'user',
91
- 'content': {
92
- "type": "file_url",
93
- "file_url": {"url": "https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf", "detai": "auto"}
94
- },
92
+ # 'content': {
93
+ # "type": "file_url",
94
+ # "file_url": {"url": "https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf", "detai": "auto"}
95
+ # },
95
96
  # 'content': "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 这个文件讲了什么?",
96
97
  # 'content': "https://translate.google.com/?sl=zh-CN&tl=en&text=%E6%8F%90%E4%BE%9B%E6%96%B9&op=tr1anslate 这个文件讲了什么?",
97
98
 
98
99
  # "content": "总结下 https://oss.ffire.cc/files/百炼系列手机产品介绍.docx"
99
100
  # "content": "https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf\n\n总结下"
100
101
 
102
+ "content": "https://admin.ilovechatgpt.top/file/lunIMYAIzhinengzhushouduishenghuodocx_14905733.docx 总结"
103
+
101
104
  },
102
105
 
103
106
  # {'role': 'assistant', 'content': "好的"},
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : search
5
+ # @Time : 2025/1/27 13:41
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description : todo: 格式匹配
10
+
11
+ from meutils.pipe import *
12
+ from meutils.llm.clients import AsyncOpenAI, zhipuai_client, moonshot_client
13
+ from meutils.llm.openai_utils import to_openai_params
14
+ from meutils.schemas.openai_types import chat_completion, chat_completion_chunk, ChatCompletionRequest, CompletionUsage
15
+
16
+
17
+ class Completions(object):
18
+
19
+ def __init__(self, api_key: Optional[str] = None):
20
+ self.api_key = api_key
21
+
22
+ async def create(self, request: ChatCompletionRequest):
23
+ request.model = request.model.removesuffix("-search")
24
+
25
+ if request.model.startswith("baichuan"):
26
+ base_url = os.getenv("BAICHUAN_BASE_URL")
27
+ api_key = self.api_key or os.getenv("BAICHUAN_API_KEY")
28
+
29
+ request.tools = [
30
+ {
31
+ "type": "web_search",
32
+ "web_search": {
33
+ "enable": True,
34
+ "search_mode": "performance_first"
35
+ }
36
+ }
37
+ ]
38
+ data = to_openai_params(request)
39
+ client = AsyncOpenAI(base_url=base_url, api_key=api_key)
40
+ completion = await client.chat.completions.create(**data)
41
+ return completion
42
+
43
+ elif request.model.startswith(("moonshot", "kimi")):
44
+ tool_call_name = "$web_search"
45
+ request.tools = [
46
+ {
47
+ "type": "builtin_function", # <-- 我们使用 builtin_function 来表示 Kimi 内置工具,也用于区分普通 function
48
+ "function": {
49
+ "name": "$web_search",
50
+ },
51
+ },
52
+ ]
53
+
54
+ data = to_openai_params(request)
55
+ completion = await moonshot_client.chat.completions.create(**data)
56
+
57
+ tool_call = completion.choices[0].message.tool_calls[0]
58
+ tool_call_arguments = tool_call.function.arguments
59
+ print(tool_call_arguments)
60
+
61
+ request.messages.append({
62
+ "role": "tool",
63
+ "tool_call_id": tool_call.id,
64
+ "name": tool_call_name,
65
+ "content": tool_call_arguments,
66
+ })
67
+ logger.debug(request.messages)
68
+ data = to_openai_params(request)
69
+ logger.debug(data)
70
+ completion = await moonshot_client.chat.completions.create(**data)
71
+ return completion
72
+
73
+ elif request.model.startswith("doubao"):
74
+ base_url = os.getenv("DOUBAO_BASE_URL")
75
+ api_key = self.api_key or os.getenv("DOUBAO_API_KEY")
76
+
77
+ request.model = "bot-20250127143547-c8q8m"
78
+ request.tools = [
79
+ {
80
+ "type": "web_search",
81
+ "web_search": {
82
+ "enable": True,
83
+ "search_mode": "performance_first"
84
+ }
85
+ }
86
+ ]
87
+ data = to_openai_params(request)
88
+ client = AsyncOpenAI(base_url=base_url, api_key=api_key)
89
+
90
+ completion = await client.chat.completions.create(**data)
91
+ return completion
92
+
93
+ else: # glm
94
+ request.model = "web-search-pro"
95
+ data = to_openai_params(request)
96
+ completion = await zhipuai_client.chat.completions.create(**data)
97
+ logger.debug(completion)
98
+ return completion
99
+
100
+
101
+ if __name__ == '__main__':
102
+ request = ChatCompletionRequest(
103
+ # model="baichuan4-turbo",
104
+ model="xx",
105
+ # model="moonshot-v1-8k",
106
+ # model="doubao",
107
+
108
+ messages=[
109
+ {"role": "user", "content": "南京天气如何"}
110
+ ],
111
+
112
+ stream=False
113
+ )
114
+
115
+ arun(Completions().create(request))
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : mineru
5
+ # @Time : 2025/1/23 13:13
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+
13
+ import requests
14
+
15
+ token = """
16
+ eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJqdGkiOiI4MDAwNDQ3NyIsInJvbCI6IlJPTEVfUkVHSVNURVIiLCJpc3MiOiJPcGVuWExhYiIsImlhdCI6MTczNzYxMTQ5MiwiY2xpZW50SWQiOiJsa3pkeDU3bnZ5MjJqa3BxOXgydyIsInBob25lIjoiIiwidXVpZCI6IjczNTZjNjY1LTU4MTMtNGQxNC04ZjFiLWM0NWIyZmFhYTBhMCIsImVtYWlsIjoiMzEzMzAzMzAzQHFxLmNvbSIsImV4cCI6MTczODgyMTA5Mn0.i8CwWoRE6j5wAC_hD9z9amkWT56HdOewgXMFV4jMpg17JHB0HOY-K4o9zp06Puav2vxkuC3Lnqm_8ip7-QdxsQ
17
+ """
18
+ url = 'https://mineru.net/api/v4/extract/task'
19
+ header = {
20
+ 'Content-Type': 'application/json',
21
+ "Authorization": f"Bearer {token.strip()}"
22
+ }
23
+ data = {
24
+ 'url': 'https://cdn-mineru.openxlab.org.cn/demo/example.pdf',
25
+ 'is_ocr': True,
26
+ 'enable_formula': False,
27
+ }
28
+
29
+ res = requests.post(url, headers=header, json=data)
30
+ print(res.status_code)
31
+ print(res.json())
32
+ print(res.json()["data"])
33
+
34
+ # {'task_id': 'adb223f6-794b-4950-8d60-d766ebd0bf14'}
35
+
36
+ task_id = 'adb223f6-794b-4950-8d60-d766ebd0bf14'
37
+ import requests
38
+
39
+ url = f'https://mineru.net/api/v4/extract/task/{task_id}'
40
+ header = {
41
+ 'Content-Type':'application/json',
42
+ "Authorization": f"Bearer {token.strip()}"
43
+ }
44
+
45
+ res = requests.get(url, headers=header)
46
+ print(res.status_code)
47
+ print(res.json())
48
+ print(res.json()["data"])
@@ -33,7 +33,7 @@ status_mapper = {
33
33
 
34
34
 
35
35
  class VideoRequest(BaseModel):
36
- """
36
+ """https://platform.minimaxi.com/document/video_generation?key=66d1439376e52fcee2853049
37
37
  23000 文生视频
38
38
  "T2V-01": "23000"
39
39
  "I2V-01": "23001"
@@ -61,6 +61,11 @@ class VideoRequest(BaseModel):
61
61
  传入图片需要满足以下条件:格式为JPG/JPEG/PNG;长宽比大于2:5、小于5:2;短边像素大于300px;体积不大于20MB。"""
62
62
  first_frame_image: Optional[str] = None
63
63
 
64
+ """本参数仅当model选择为S2V-01时可用。模型将依据此参数中上传的主体来生成视频。目前仅支持单主体参考(数组长度为 1)。"""
65
+ # subject_reference: list = [{"type": "character", "image": ""}]
66
+
67
+ callback_url: Optional[str] = None
68
+
64
69
  "n"
65
70
  n: int = 1
66
71
 
@@ -133,13 +138,14 @@ class VideoResponse(BaseModel):
133
138
  base_resp: BaseResponse # response.statusInfo
134
139
 
135
140
  """
141
+ SUBMITTED-已提交
136
142
  Preparing-准备中
137
143
  Queueing-队列中
138
144
  Processing-生成中
139
145
  Success-成功
140
146
  Failed-失败
141
147
  """
142
- status: str = "Queueing"
148
+ status: str = "SUBMITTED"
143
149
  file_id: Optional[str] = None # 通过file_id 可以获取视频地址download_url
144
150
 
145
151
  videos: Optional[List[Video]] = None # response.data.videos