MeUtils 2025.1.23.10.16.28__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.23.10.16.28.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/METADATA +26 -27
- {MeUtils-2025.1.23.10.16.28.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/RECORD +31 -29
- examples/_openaisdk/4v.py +3 -4
- examples/_openaisdk/openai_baichuan.py +7 -3
- examples/_openaisdk/openai_chatfire.py +15 -4
- examples/_openaisdk/openai_deepinfra.py +2 -2
- examples/_openaisdk/openai_modelscope.py +2 -1
- examples/_openaisdk/openai_together.py +2 -1
- examples/_openaisdk/openai_zhipu.py +9 -5
- examples/json_jmespath.py +13 -13
- meutils/apis/hunyuan/image_tools.py +6 -2
- meutils/apis/images/edits.py +70 -2
- meutils/apis/jimeng/common.py +0 -144
- meutils/apis/jimeng/files.py +25 -12
- meutils/apis/jimeng/images.py +148 -1
- meutils/apis/jimeng/videos.py +176 -107
- meutils/data/VERSION +1 -1
- meutils/jwt_utils/common.py +46 -0
- meutils/llm/clients.py +4 -1
- meutils/llm/completions/agents/search.py +115 -0
- meutils/parsers/fileparser/mineru.py +48 -0
- meutils/schemas/image_types.py +10 -1
- meutils/schemas/oneapi/common.py +17 -5
- meutils/schemas/oneapi/models.py +1 -1
- meutils/schemas/openai_types.py +1 -1
- meutils/schemas/video_types.py +9 -1
- meutils/request_utils/jwt_utils/common.py +0 -42
- {MeUtils-2025.1.23.10.16.28.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/LICENSE +0 -0
- {MeUtils-2025.1.23.10.16.28.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/WHEEL +0 -0
- {MeUtils-2025.1.23.10.16.28.dist-info → MeUtils-2025.1.27.15.5.31.dist-info}/entry_points.txt +0 -0
- {MeUtils-2025.1.23.10.16.28.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
meutils/apis/jimeng/videos.py
CHANGED
@@ -13,13 +13,15 @@
|
|
13
13
|
3. 上传音频+创建任务
|
14
14
|
|
15
15
|
"""
|
16
|
+
import asyncio
|
17
|
+
|
16
18
|
from meutils.pipe import *
|
17
19
|
from meutils.str_utils.json_utils import json_path
|
18
20
|
|
19
21
|
from meutils.schemas.jimeng_types import BASE_URL, MODELS_MAP, FEISHU_URL
|
20
22
|
from meutils.schemas.video_types import LipsyncVideoRquest
|
21
23
|
from meutils.schemas.task_types import TaskResponse
|
22
|
-
from meutils.apis.jimeng.common import
|
24
|
+
from meutils.apis.jimeng.common import get_headers, check_token
|
23
25
|
from meutils.apis.jimeng.files import upload_for_image, upload_for_video
|
24
26
|
|
25
27
|
from meutils.config_utils.lark_utils import get_next_token_for_polling
|
@@ -29,50 +31,52 @@ from fake_useragent import UserAgent
|
|
29
31
|
ua = UserAgent()
|
30
32
|
|
31
33
|
|
32
|
-
async def create_realman_avatar(
|
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
|
+
|
33
38
|
url = "/mweb/v1/create_realman_avatar"
|
34
39
|
headers = get_headers(url, token)
|
35
40
|
|
36
41
|
payload = {
|
37
42
|
"input_list": [
|
38
43
|
{
|
39
|
-
"image_uri":
|
44
|
+
"image_uri": image_url,
|
40
45
|
"submit_id": str(uuid.uuid4()),
|
41
46
|
"mode": 0
|
42
47
|
},
|
43
48
|
{
|
44
|
-
"image_uri":
|
49
|
+
"image_uri": image_url,
|
45
50
|
"submit_id": str(uuid.uuid4()),
|
46
51
|
"mode": 1
|
47
52
|
}
|
48
53
|
]
|
49
54
|
}
|
55
|
+
|
50
56
|
async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60) as client:
|
51
57
|
response = await client.post(url, json=payload)
|
52
58
|
response.raise_for_status()
|
53
59
|
data = response.json()
|
54
60
|
logger.debug(bjson(data)) # 1914628189186
|
55
61
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
60
66
|
|
61
|
-
|
62
|
-
|
67
|
+
else:
|
68
|
+
response.message = str(json_path(data, "$..message"))
|
69
|
+
response.status = "fail"
|
70
|
+
return response
|
63
71
|
|
64
72
|
|
65
|
-
async def get_task(
|
73
|
+
async def get_task(task_id: str, token: str = "916fed81175f5186a2c05375699ea40d"):
|
66
74
|
"""
|
67
75
|
$..image_to_avatar 成功: 先检测图片or视频
|
68
76
|
:param task_ids:
|
69
77
|
:return:
|
70
78
|
"""
|
71
|
-
|
72
|
-
task_ids = [task_ids]
|
73
|
-
|
74
|
-
token = "916fed81175f5186a2c05375699ea40d"
|
75
|
-
|
79
|
+
task_ids = task_id.split()
|
76
80
|
|
77
81
|
url = "/mweb/v1/mget_generate_task"
|
78
82
|
headers = get_headers(url, token)
|
@@ -84,19 +88,42 @@ async def get_task(task_ids):
|
|
84
88
|
data = response.json()
|
85
89
|
logger.debug(bjson(data))
|
86
90
|
|
87
|
-
if
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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"
|
92
106
|
|
93
|
-
|
94
|
-
|
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"
|
95
110
|
|
96
|
-
|
97
|
-
resource_id_loopy = "".join(resource_id_loopys)
|
98
|
-
# return TaskResponse()
|
111
|
+
return response
|
99
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
|
100
127
|
|
101
128
|
|
102
129
|
async def create_task(request: LipsyncVideoRquest, token: Optional[str] = None):
|
@@ -108,43 +135,121 @@ async def create_task(request: LipsyncVideoRquest, token: Optional[str] = None):
|
|
108
135
|
|
109
136
|
headers = get_headers(url, token)
|
110
137
|
|
111
|
-
|
112
|
-
|
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 = {}
|
113
168
|
if request.video_url:
|
114
169
|
v2v_opt = {}
|
115
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
|
+
|
116
240
|
payload = {
|
117
241
|
"submit_id": "",
|
118
|
-
"task_extra": "{\"promptSource\":\"photo_lip_sync\",\"generateTimes\":1,\"lipSyncInfo\":{\"sourceType\":\"local-file\",\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\"},\"isUseAiGenPrompt\":false,\"batchNumber\":1}",
|
242
|
+
# "task_extra": "{\"promptSource\":\"photo_lip_sync\",\"generateTimes\":1,\"lipSyncInfo\":{\"sourceType\":\"local-file\",\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\"},\"isUseAiGenPrompt\":false,\"batchNumber\":1}",
|
119
243
|
"http_common_info": {
|
120
244
|
"aid": 513695
|
121
245
|
},
|
122
246
|
"input": {
|
123
|
-
"seed":
|
247
|
+
"seed": 2032846910,
|
124
248
|
"video_gen_inputs": [
|
125
249
|
{
|
126
|
-
"v2v_opt":
|
127
|
-
"i2v_opt":
|
128
|
-
|
129
|
-
"enable": True,
|
130
|
-
"origin_image": {
|
131
|
-
# "width": 800,
|
132
|
-
# "height": 1200,
|
133
|
-
"image_uri": "tos-cn-i-tb4s082cfz/4dead1bfc8e84572a91f2e047016a351",
|
134
|
-
"image_url": ""
|
135
|
-
},
|
136
|
-
"origin_audio": {
|
137
|
-
# "duration": 9.976625,
|
138
|
-
"vid": "v02870g10004cu8d4r7og65j2vr5opb0"
|
139
|
-
},
|
140
|
-
|
141
|
-
"resource_id_std": "381c534f-bcef-482e-8f17-5b30b64e41a1",
|
142
|
-
"resource_id_loopy": "b9ac51cb-e26c-4b63-81d9-34ed24053032",
|
143
|
-
#
|
144
|
-
# "tts_info": "{\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\",\"source_type\":\"local-file\"}"
|
145
|
-
}
|
146
|
-
},
|
147
|
-
"audio_vid": "v02870g10004cu8d4r7og65j2vr5opb0",
|
250
|
+
"v2v_opt": v2v_opt,
|
251
|
+
"i2v_opt": i2v_opt,
|
252
|
+
"audio_vid": audio_vid,
|
148
253
|
"video_mode": 4
|
149
254
|
}
|
150
255
|
]
|
@@ -155,67 +260,17 @@ async def create_task(request: LipsyncVideoRquest, token: Optional[str] = None):
|
|
155
260
|
"resource_id": "generate_video",
|
156
261
|
"resource_id_type": "str",
|
157
262
|
"resource_sub_type": "aigc",
|
158
|
-
"benefit_type":
|
263
|
+
"benefit_type": model,
|
159
264
|
# "benefit_type": "lip_sync_avatar_lively" # 10积分
|
160
265
|
},
|
161
|
-
"scene":
|
266
|
+
"scene": scene,
|
162
267
|
"client_trace_data": {},
|
163
268
|
"submit_id_list": [
|
164
269
|
str(uuid.uuid4())
|
165
270
|
]
|
166
271
|
}
|
167
272
|
|
168
|
-
|
169
|
-
# i2v_opt = {
|
170
|
-
# "realman_avatar": {
|
171
|
-
# "enable": True,
|
172
|
-
# "origin_image": {
|
173
|
-
# "width": 800,
|
174
|
-
# "height": 1200, ######## 没必要把
|
175
|
-
# "image_uri": request.image_url,
|
176
|
-
# "image_url": ""
|
177
|
-
# },
|
178
|
-
# "resource_id_loopy": "9c397499-a59f-47b5-9bfd-e1397ec62f61",
|
179
|
-
# "resource_id_std": "0a8c8d72-5543-4e9e-8843-c03fe5b3a8c7",
|
180
|
-
# "origin_audio": {
|
181
|
-
# "duration": 9.976625,
|
182
|
-
# "vid": "v03870g10004cu6vpgfog65nc9ivupg0"
|
183
|
-
# },
|
184
|
-
# "tts_info": "{\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\",\"source_type\":\"local-file\"}"
|
185
|
-
# }
|
186
|
-
# }
|
187
|
-
#
|
188
|
-
# payload = {
|
189
|
-
# "submit_id": "",
|
190
|
-
# "task_extra": "{\"promptSource\":\"photo_lip_sync\",\"generateTimes\":1,\"lipSyncInfo\":{\"sourceType\":\"local-file\",\"name\":\"vyFWygmZsIZlUO4s0nr2n.wav\"},\"isUseAiGenPrompt\":false,\"batchNumber\":1}",
|
191
|
-
# "http_common_info": {
|
192
|
-
# "aid": 513695
|
193
|
-
# },
|
194
|
-
# "input": {
|
195
|
-
# "seed": 2032846910,
|
196
|
-
# "video_gen_inputs": [
|
197
|
-
# {
|
198
|
-
# "v2v_opt": v2v_opt,
|
199
|
-
# "i2v_opt": i2v_opt,
|
200
|
-
# "audio_vid": "v03870g10004cu6vpgfog65nc9ivupg0",
|
201
|
-
# "video_mode": 4
|
202
|
-
# }
|
203
|
-
# ]
|
204
|
-
# },
|
205
|
-
# "mode": "workbench",
|
206
|
-
# "history_option": {},
|
207
|
-
# "commerce_info": {
|
208
|
-
# "resource_id": "generate_video",
|
209
|
-
# "resource_id_type": "str",
|
210
|
-
# "resource_sub_type": "aigc",
|
211
|
-
# "benefit_type": "lip_sync_avatar_std"
|
212
|
-
# },
|
213
|
-
# "scene": "lip_sync_image",
|
214
|
-
# "client_trace_data": {},
|
215
|
-
# "submit_id_list": [
|
216
|
-
# "4717038e-f4fd-4c1c-b5a5-39ae4118099c"
|
217
|
-
# ]
|
218
|
-
# }
|
273
|
+
logger.debug(bjson(payload))
|
219
274
|
|
220
275
|
async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60) as client:
|
221
276
|
response = await client.post(url, json=payload)
|
@@ -229,8 +284,22 @@ async def create_task(request: LipsyncVideoRquest, token: Optional[str] = None):
|
|
229
284
|
|
230
285
|
|
231
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
|
+
|
232
300
|
# image_uri = "tos-cn-i-tb4s082cfz/387649a361e546f89549bd3510ab926d"
|
233
301
|
# task_ids = arun(create_realman_avatar(image_uri, token="7c5e148d9fa858e3180c42f843c20454"))
|
234
302
|
# arun(mget_generate_task(task_ids))
|
235
|
-
|
236
|
-
|
303
|
+
with timer():
|
304
|
+
r = arun(create_task(request))
|
305
|
+
# arun(get_task(r.task_id))
|
meutils/data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2025.01.
|
1
|
+
2025.01.27.15.05.31
|
@@ -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
|
+
|
@@ -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/image_types.py
CHANGED
@@ -459,7 +459,16 @@ class TextinImageProcessRequest(ImageProcessRequest):
|
|
459
459
|
|
460
460
|
|
461
461
|
class ImageProcess(BaseModel):
|
462
|
-
model: Literal[
|
462
|
+
model: Literal[
|
463
|
+
"remove-watermark",
|
464
|
+
"clarity",
|
465
|
+
|
466
|
+
"hunyuan-remove-watermark",
|
467
|
+
"hunyuan-clarity",
|
468
|
+
|
469
|
+
"expand",
|
470
|
+
"rmbg-2.0"
|
471
|
+
]
|
463
472
|
image: str
|
464
473
|
mask: Optional[str] = None
|
465
474
|
|