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.
- {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/METADATA +27 -28
- {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/RECORD +46 -43
- examples/_openaisdk/4v.py +3 -4
- examples/_openaisdk/openai_baichuan.py +7 -3
- examples/_openaisdk/openai_chatfire.py +17 -4
- examples/_openaisdk/openai_deepinfra.py +2 -2
- examples/_openaisdk/openai_deepseek.py +7 -6
- examples/_openaisdk/openai_doubao.py +16 -7
- examples/_openaisdk/openai_embeddings.py +1 -1
- examples/_openaisdk/openai_modelscope.py +2 -1
- examples/_openaisdk/openai_together.py +2 -1
- meutils/apis/jimeng/lip_sync.py → examples/_openaisdk/openai_x.py +3 -2
- examples/_openaisdk/openai_zhipu.py +9 -5
- examples/bserver.py +60 -518
- examples/json_jmespath.py +13 -13
- meutils/apis/fal/videos.py +13 -7
- meutils/apis/hailuoai/videos.py +16 -6
- meutils/apis/hunyuan/image_tools.py +6 -2
- meutils/apis/images/edits.py +74 -6
- meutils/apis/images/recraft.py +5 -5
- meutils/apis/jimeng/common.py +2 -147
- meutils/apis/jimeng/doubao.py +2 -2
- meutils/apis/jimeng/files.py +84 -29
- meutils/apis/jimeng/images.py +177 -11
- meutils/apis/jimeng/videos.py +305 -0
- meutils/apis/oneapi/user.py +3 -1
- meutils/data/VERSION +1 -1
- meutils/io/files_utils.py +9 -3
- meutils/jwt_utils/common.py +46 -0
- meutils/llm/clients.py +4 -1
- meutils/llm/completions/agents/file.py +7 -4
- meutils/llm/completions/agents/search.py +115 -0
- meutils/parsers/fileparser/mineru.py +48 -0
- meutils/schemas/hailuo_types.py +8 -2
- meutils/schemas/image_types.py +19 -5
- meutils/schemas/oneapi/common.py +152 -45
- meutils/schemas/oneapi/models.py +1 -1
- meutils/schemas/openai_types.py +1 -1
- meutils/schemas/task_types.py +2 -0
- meutils/schemas/video_types.py +19 -1
- meutils/str_utils/json_utils.py +29 -1
- meutils/request_utils/jwt_utils/common.py +0 -42
- {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/LICENSE +0 -0
- {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/WHEEL +0 -0
- {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/entry_points.txt +0 -0
- {MeUtils-2025.1.17.19.49.29.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/top_level.txt +0 -0
- /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))
|
meutils/apis/oneapi/user.py
CHANGED
@@ -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
|
-
|
102
|
+
arun(get_user_money("sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv"))
|
meutils/data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2025.01.
|
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
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
93
|
-
|
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"])
|
meutils/schemas/hailuo_types.py
CHANGED
@@ -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 = "
|
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
|