MeUtils 2024.12.23.16.36.51__py3-none-any.whl → 2024.12.31.17.51.53__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-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/METADATA +26 -26
- {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/RECORD +44 -38
- examples/_openaisdk/4v.py +5 -3
- examples/_openaisdk/openai_chatfire.py +9 -1
- examples/_openaisdk/openai_modelscope.py +6 -2
- examples/_openaisdk/openai_siliconflow.py +1 -1
- examples/_openaisdk/openai_tune.py +7 -4
- examples/_openaisdk/openai_zhipu.py +7 -5
- examples/_openaisdk/zhipu_/346/231/272/350/203/275/344/275/223.py +45 -0
- meutils/_utils.py +15 -1
- meutils/apis/chatglm/glm_video_api.py +34 -2
- meutils/apis/hailuoai/videos.py +1 -1
- meutils/apis/images/recraft.py +2 -3
- meutils/apis/jimeng/common.py +6 -3
- meutils/apis/jimeng/images.py +41 -6
- meutils/apis/kling/kolors_virtual_try_on.py +29 -5
- meutils/apis/oneapi/user.py +3 -3
- meutils/apis/oneapi/utils.py +32 -0
- meutils/async_utils/common.py +11 -1
- meutils/common.py +2 -0
- meutils/config_utils/lark_utils/common.py +2 -2
- meutils/data/VERSION +1 -1
- meutils/data/oneapi/NOTICE.md +15 -0
- meutils/db/orm.py +40 -5
- meutils/db/redis_db.py +8 -5
- meutils/decorators/polling.py +46 -0
- meutils/init/evn.py +1 -1
- meutils/llm/completions/modelscope.py +11 -0
- meutils/llm/completions/rag/fire.py +42 -12
- meutils/llm/openai_utils/common.py +1 -1
- meutils/request_utils/ark.py +47 -0
- meutils/{jwt_utils → request_utils/jwt_utils}/common.py +1 -0
- meutils/request_utils/volc.py +160 -0
- meutils/schemas/db/oneapi_types.py +30 -0
- meutils/schemas/image_types.py +2 -0
- meutils/schemas/oneapi/common.py +27 -10
- meutils/schemas/openai_types.py +17 -6
- meutils/schemas/video_types.py +34 -1
- meutils/serving/fastapi/dependencies/auth.py +34 -6
- {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/LICENSE +0 -0
- {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/WHEEL +0 -0
- {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/entry_points.txt +0 -0
- {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/top_level.txt +0 -0
- /meutils/{jwt_utils → request_utils/jwt_utils}/__init__.py +0 -0
meutils/apis/hailuoai/videos.py
CHANGED
@@ -335,7 +335,7 @@ async def get_task(task_id: str, token: str):
|
|
335
335
|
response = VideoResponse(
|
336
336
|
task_id=task_id,
|
337
337
|
base_resp=data.get('statusInfo', {}),
|
338
|
-
videos=data.get('data'
|
338
|
+
videos=(data.get('data') or {}).get("videos")
|
339
339
|
)
|
340
340
|
return response
|
341
341
|
|
meutils/apis/images/recraft.py
CHANGED
@@ -122,6 +122,5 @@ if __name__ == '__main__':
|
|
122
122
|
|
123
123
|
tokens = list(arun(aget_spreadsheet_values(feishu_url=FEISHU_URL, to_dataframe=True))[0]) | xfilter_
|
124
124
|
|
125
|
-
|
126
|
-
|
127
|
-
arun(check_token(tokens))
|
125
|
+
|
126
|
+
r = arun(check_token(tokens))
|
meutils/apis/jimeng/common.py
CHANGED
@@ -89,8 +89,8 @@ async def get_credit(token):
|
|
89
89
|
async def check_token(token, threshold: int = 1):
|
90
90
|
try:
|
91
91
|
response = await get_credit(token)
|
92
|
+
logger.debug(bjson(response))
|
92
93
|
credits = sum(response['data']['credit'].values())
|
93
|
-
# logger.debug(credits)
|
94
94
|
return credits >= threshold
|
95
95
|
except Exception as e:
|
96
96
|
return False
|
@@ -244,8 +244,11 @@ async def create_draft_content(request: ImageRequest, token: str):
|
|
244
244
|
if __name__ == '__main__':
|
245
245
|
token = "693701c43e477b7c405cc7e2fef0ddbd"
|
246
246
|
token = "eb4d120829cfd3ee957943f63d6152ed"
|
247
|
-
|
248
|
-
|
247
|
+
token = "dcf7bbc31faed9740b0bf748cd4d2c74"
|
248
|
+
token = "38d7d300b5e0a803431ef88d8d2acfef"
|
249
|
+
token = "916fed81175f5186a2c05375699ea40d"
|
250
|
+
# arun(get_credit(token))
|
251
|
+
arun(check_token(token))
|
249
252
|
|
250
253
|
# arun(get_upload_token(token))
|
251
254
|
#
|
meutils/apis/jimeng/images.py
CHANGED
@@ -70,8 +70,19 @@ async def get_task(task_id, token):
|
|
70
70
|
response = await client.post(url, json=payload)
|
71
71
|
response.raise_for_status()
|
72
72
|
data = response.json()
|
73
|
+
logger.debug(bjson(data))
|
73
74
|
# {'ret': '1015', 'errmsg': 'login error', 'systime': '1734524280', 'logid': '20241218201800AC3267447B287E9E6C46', 'data': None}
|
74
|
-
|
75
|
+
task_info = (data.get("data") or {}).get(task_id, {})
|
76
|
+
item_list = task_info.get("item_list") # "status": 30,
|
77
|
+
|
78
|
+
status_code = task_info.get("status")
|
79
|
+
logger.debug(f"status: {status_code}")
|
80
|
+
|
81
|
+
"""
|
82
|
+
"status": 30, # 内容审核
|
83
|
+
"status": 50,
|
84
|
+
"""
|
85
|
+
|
75
86
|
image_data = map(lambda x: x.get("image", {}).get("large_images"), item_list)
|
76
87
|
|
77
88
|
task_data = sum(image_data, []) | xmap_(lambda x: {"url": x.get("image_url")})
|
@@ -79,18 +90,29 @@ async def get_task(task_id, token):
|
|
79
90
|
return TaskResponse(
|
80
91
|
task_id=task_id,
|
81
92
|
data=task_data,
|
82
|
-
message=data.get("errmsg"),
|
83
|
-
status="success" if
|
93
|
+
message=data.get("errmsg") if status_code!=30 else "触发内容审核451",
|
94
|
+
status="success" if item_list else 'processing',
|
95
|
+
code=status_code,
|
84
96
|
)
|
85
97
|
|
86
98
|
|
99
|
+
async def generate(request: ImageRequest):
|
100
|
+
task_response = await create_task(request)
|
101
|
+
for i in range(1, 10):
|
102
|
+
await asyncio.sleep(max(10 / i, 1))
|
103
|
+
response = await get_task(task_response.task_id, task_response.system_fingerprint)
|
104
|
+
logger.debug(response)
|
105
|
+
if data := response.data:
|
106
|
+
return {"data": data}
|
107
|
+
|
108
|
+
|
87
109
|
if __name__ == '__main__':
|
88
|
-
token = "
|
110
|
+
token = "eb4d120829cfd3ee957943f63d6152ed"
|
89
111
|
|
90
|
-
request = ImageRequest(prompt="
|
112
|
+
# request = ImageRequest(prompt="做一个圣诞节的海报", size="1024x1024")
|
91
113
|
# request = ImageRequest(prompt="https://oss.ffire.cc/files/kling_watermark.png 让她带上墨镜", size="1024x1024")
|
92
114
|
|
93
|
-
arun(create_task(request))
|
115
|
+
# task = arun(create_task(request))
|
94
116
|
|
95
117
|
# task_id = "10040025470722"
|
96
118
|
|
@@ -103,3 +125,16 @@ if __name__ == '__main__':
|
|
103
125
|
# task_id = "10082971040514"
|
104
126
|
#
|
105
127
|
# arun(get_task(task_id, token))
|
128
|
+
|
129
|
+
# arun(get_task(task.task_id, task.system_fingerprint))
|
130
|
+
|
131
|
+
task_id = "10184295086338"
|
132
|
+
system_fingerprint = "eb4d120829cfd3ee957943f63d6152ed"
|
133
|
+
|
134
|
+
t1 = ("10184295086338", "eb4d120829cfd3ee957943f63d6152ed")
|
135
|
+
t2 = ("10184877310722", "dcf7bbc31faed9740b0bf748cd4d2c74")
|
136
|
+
t3 = ("10186352959490", "eb4d120829cfd3ee957943f63d6152ed")
|
137
|
+
|
138
|
+
arun(get_task(*t3))
|
139
|
+
|
140
|
+
# arun(generate(ImageRequest(prompt="做一个圣诞节的海报")))
|
@@ -10,10 +10,13 @@
|
|
10
10
|
import jwt
|
11
11
|
|
12
12
|
from meutils.pipe import *
|
13
|
-
from meutils.schemas.task_types import TaskResponse
|
13
|
+
from meutils.schemas.task_types import TaskResponse
|
14
|
+
from meutils.schemas.image_types import ImageRequest, ImagesResponse
|
15
|
+
|
14
16
|
from meutils.schemas.kling_types import API_BASE_URL, TryOnRequest, TaskResponse
|
15
17
|
from meutils.config_utils.lark_utils import get_next_token_for_polling
|
16
18
|
from meutils.decorators.retry import retrying
|
19
|
+
from meutils.str_utils.regular_expression import parse_url
|
17
20
|
|
18
21
|
FEISHU_URL = "https://xchatllm.feishu.cn/sheets/GYCHsvI4qhnDPNtI4VPcdw2knEd?sheet=cjTepf"
|
19
22
|
|
@@ -39,7 +42,7 @@ def encode_jwt_token(token):
|
|
39
42
|
######################################################################
|
40
43
|
@alru_cache(ttl=3600)
|
41
44
|
@retrying(title=__name__)
|
42
|
-
async def create_task(request: TryOnRequest, token: Optional[str] = None):
|
45
|
+
async def create_task(request: TryOnRequest, token: Optional[str] = None):
|
43
46
|
token = token or await get_next_token_for_polling(FEISHU_URL)
|
44
47
|
token = encode_jwt_token(token)
|
45
48
|
|
@@ -68,8 +71,23 @@ async def get_task(task_id, token):
|
|
68
71
|
return TaskResponse(**data)
|
69
72
|
|
70
73
|
|
74
|
+
async def generate(request: ImageRequest):
|
75
|
+
human_image, cloth_image = parse_url(request.prompt) # 两张图片
|
76
|
+
|
77
|
+
request = TryOnRequest(human_image=human_image, cloth_image=cloth_image)
|
78
|
+
task_response = await create_task(request)
|
79
|
+
|
80
|
+
for i in range(1, 10):
|
81
|
+
await asyncio.sleep(max(10 / i, 1))
|
82
|
+
|
83
|
+
response = await get_task(task_response.data.task_id, task_response.system_fingerprint)
|
84
|
+
if task_result := response.data.task_result:
|
85
|
+
images = task_result.get('images', [])
|
86
|
+
return ImagesResponse(data=images)
|
87
|
+
|
88
|
+
|
71
89
|
if __name__ == '__main__':
|
72
|
-
request = TryOnRequest()
|
90
|
+
# request = TryOnRequest()
|
73
91
|
# arun(create_task(request))
|
74
92
|
# {
|
75
93
|
# "code": 0,
|
@@ -83,5 +101,11 @@ if __name__ == '__main__':
|
|
83
101
|
# }
|
84
102
|
# }
|
85
103
|
|
86
|
-
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkMmU1NmZkY2ZiODY0MmZmYWEyMjZlZWIxNzY4MzMyMiIsImV4cCI6MTczMzE4OTI4OSwibmJmIjoxNzMzMTAyODg0fQ.YjB792REbuFaUoyUXvd5bpI76_0PBWawDHDjPHOBA5Q'
|
87
|
-
arun(get_task("CjiL9mdJhswAAAAAAG2C6g", token))
|
104
|
+
# token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkMmU1NmZkY2ZiODY0MmZmYWEyMjZlZWIxNzY4MzMyMiIsImV4cCI6MTczMzE4OTI4OSwibmJmIjoxNzMzMTAyODg0fQ.YjB792REbuFaUoyUXvd5bpI76_0PBWawDHDjPHOBA5Q'
|
105
|
+
# arun(get_task("CjiL9mdJhswAAAAAAG2C6g", token))
|
106
|
+
|
107
|
+
human_image: str = "https://oss.ffire.cc/files/try-on.png"
|
108
|
+
cloth_image: str = "https://oss.ffire.cc/files/x.png"
|
109
|
+
|
110
|
+
request = ImageRequest(prompt=f"{human_image}\n{cloth_image}")
|
111
|
+
arun(generate(request))
|
meutils/apis/oneapi/user.py
CHANGED
@@ -91,10 +91,10 @@ async def put_user(payload, add_money: float = 0):
|
|
91
91
|
|
92
92
|
if __name__ == '__main__':
|
93
93
|
# api-key => get_one_log => get_user => put_user
|
94
|
-
|
94
|
+
arun(get_user(814))
|
95
95
|
# payload = arun(get_user(924))
|
96
96
|
# print(payload)
|
97
97
|
# arun(put_user(payload, -1))
|
98
98
|
|
99
|
-
arun(get_api_key_log('sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv'))
|
100
|
-
# arun(get_user_money("sk-
|
99
|
+
# arun(get_api_key_log('sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv'))
|
100
|
+
# arun(get_user_money("sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv"))
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Project : AI. @by PyCharm
|
4
|
+
# @File : utils
|
5
|
+
# @Time : 2024/12/25 18:13
|
6
|
+
# @Author : betterme
|
7
|
+
# @WeChat : meutils
|
8
|
+
# @Software : PyCharm
|
9
|
+
# @Description :
|
10
|
+
|
11
|
+
from meutils.pipe import *
|
12
|
+
|
13
|
+
from meutils.caches.redis_cache import cache
|
14
|
+
from meutils.db.orm import select_first
|
15
|
+
from meutils.schemas.db.oneapi_types import OneapiTask, OneapiUser, OneapiToken
|
16
|
+
|
17
|
+
|
18
|
+
# engine
|
19
|
+
|
20
|
+
|
21
|
+
@cache()
|
22
|
+
async def token2user(api_key: str):
|
23
|
+
logger.debug(api_key)
|
24
|
+
filter_kwargs = {
|
25
|
+
"key": api_key[3:],
|
26
|
+
}
|
27
|
+
|
28
|
+
return await select_first(OneapiToken, filter_kwargs)
|
29
|
+
|
30
|
+
|
31
|
+
if __name__ == '__main__':
|
32
|
+
arun(token2user('sk-q3uMFm0TFWi5lBQVhGwAWKup28j4omr9vThL4V5ynvdWdeZ8'))
|
meutils/async_utils/common.py
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
import inspect
|
12
12
|
import asyncio
|
13
|
-
from typing import Union, Any, Coroutine, AsyncIterator, Iterator, Iterable, AsyncIterable
|
13
|
+
from typing import Union, Any, Coroutine, AsyncIterator, Iterator, Iterable, AsyncIterable, Optional, Callable
|
14
14
|
|
15
15
|
import numpy as np
|
16
16
|
import pandas as pd
|
@@ -146,6 +146,16 @@ async def arequest(url, method='get', payload=None, **client_params):
|
|
146
146
|
return resp
|
147
147
|
|
148
148
|
|
149
|
+
async def poll(fn, n: int = 30, sleep_fn: Optional[Callable] = None):
|
150
|
+
if sleep_fn is None:
|
151
|
+
sleep_fn = lambda i: max(n / (i + 1), 1) # 预估大概 2~3 *n
|
152
|
+
|
153
|
+
for i in range(n):
|
154
|
+
await asyncio.sleep(sleep_fn(i))
|
155
|
+
if _ := await fn(): # 跳出
|
156
|
+
return _
|
157
|
+
|
158
|
+
|
149
159
|
if __name__ == '__main__':
|
150
160
|
from meutils.pipe import *
|
151
161
|
|
meutils/common.py
CHANGED
@@ -382,5 +382,5 @@ if __name__ == '__main__':
|
|
382
382
|
# with timer():
|
383
383
|
# token = arun(get_next_token(feishu_url))
|
384
384
|
|
385
|
-
FEISHU_URL = "https://xchatllm.feishu.cn/sheets/XfjqszII3hZAEvtTOgecOgv2nye?sheet=c14b34"
|
386
|
-
print(arun(get_series(FEISHU_URL)))
|
385
|
+
# FEISHU_URL = "https://xchatllm.feishu.cn/sheets/XfjqszII3hZAEvtTOgecOgv2nye?sheet=c14b34"
|
386
|
+
# print(arun(get_series(FEISHU_URL)))
|
meutils/data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2024.12.
|
1
|
+
2024.12.31.17.51.53
|
meutils/data/oneapi/NOTICE.md
CHANGED
@@ -31,6 +31,21 @@
|
|
31
31
|
|
32
32
|
</details>
|
33
33
|
|
34
|
+
## 2024-12-27
|
35
|
+
- deepseek-v3
|
36
|
+
- deepseek-r1:deepseek-v3的思考模型
|
37
|
+
- deepseek-search:deepseek-v3的联网模型
|
38
|
+
|
39
|
+
## 2024-12-24
|
40
|
+
- 上线新模型
|
41
|
+
- doubao-pro-256k:相比Doubao-pro-128k/240628,长文任务效果显著提升10%以上,要点提取、字数遵循、多轮对话上文记忆等能力大幅提升
|
42
|
+
- [qvq-72b-preview](https://mp.weixin.qq.com/s/WzL7tbFUZOgE2IFMeHT-sQ):Qwen开源视觉推理模型QVQ,更睿智地看世界!
|
43
|
+
|
44
|
+
- 增加gemini-2.0配额,支持多模型,默认分组可用
|
45
|
+
- "gemini-2.0-flash"
|
46
|
+
- "gemini-2.0-flash-exp"
|
47
|
+
|
48
|
+
|
34
49
|
## 2024-12-20
|
35
50
|
- 修复SunoV4无水印版本
|
36
51
|
- [异步任务接口文档](https://api.chatfire.cn/docs/api-246593467)
|
meutils/db/orm.py
CHANGED
@@ -97,6 +97,16 @@ async def update_or_insert(entity, filter_kwargs: Optional[dict] = None, update_
|
|
97
97
|
return data
|
98
98
|
|
99
99
|
|
100
|
+
async def select_first(entity, filter_kwargs: Optional[dict] = None):
|
101
|
+
async with AsyncSession(engine) as session:
|
102
|
+
statement = select(entity).filter_by(**filter_kwargs)
|
103
|
+
|
104
|
+
if result := await session.exec(statement):
|
105
|
+
_ = result.first()
|
106
|
+
logger.debug(_)
|
107
|
+
return _
|
108
|
+
|
109
|
+
|
100
110
|
if __name__ == '__main__':
|
101
111
|
pass
|
102
112
|
|
@@ -124,21 +134,46 @@ if __name__ == '__main__':
|
|
124
134
|
#
|
125
135
|
# arun(create_db_and_tables())
|
126
136
|
|
127
|
-
from meutils.schemas.db.oneapi_types import OneapiTask
|
137
|
+
from meutils.schemas.db.oneapi_types import OneapiTask, OneapiUser, OneapiToken
|
138
|
+
|
139
|
+
# filter_kwargs = {
|
140
|
+
# "task_id": "888",
|
141
|
+
# }
|
142
|
+
#
|
143
|
+
#
|
144
|
+
# async def main():
|
145
|
+
# async with AsyncSession(engine) as session:
|
146
|
+
# statement = select(OneapiTask).filter_by(**filter_kwargs)
|
147
|
+
# result = await session.exec(statement)
|
148
|
+
# logger.debug(result)
|
149
|
+
# if result:
|
150
|
+
# logger.debug(result.first())
|
151
|
+
# # await session.commit()
|
152
|
+
#
|
153
|
+
#
|
154
|
+
# arun(update_or_insert(OneapiTask, filter_kwargs))
|
128
155
|
|
129
156
|
filter_kwargs = {
|
130
|
-
"
|
157
|
+
"id": "1",
|
131
158
|
}
|
132
159
|
|
133
160
|
|
134
161
|
async def main():
|
135
162
|
async with AsyncSession(engine) as session:
|
136
|
-
|
163
|
+
# filter_kwargs = {
|
164
|
+
# "id": "1",
|
165
|
+
# }
|
166
|
+
# statement = select(OneapiUser).filter_by(**filter_kwargs)
|
167
|
+
|
168
|
+
filter_kwargs = {
|
169
|
+
"key": "gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv",
|
170
|
+
}
|
171
|
+
statement = select(OneapiToken).filter_by(**filter_kwargs)
|
172
|
+
|
137
173
|
result = await session.exec(statement)
|
138
|
-
logger.debug(result)
|
139
174
|
if result:
|
140
175
|
logger.debug(result.first())
|
141
176
|
# await session.commit()
|
142
177
|
|
143
178
|
|
144
|
-
arun(
|
179
|
+
arun(main())
|
meutils/db/redis_db.py
CHANGED
@@ -28,9 +28,6 @@ if REDIS_URL := os.getenv("REDIS_URL"):
|
|
28
28
|
# redis_client = Redis.from_url(REDIS_URL, **kwargs)
|
29
29
|
# redis_aclient = AsyncRedis.from_url(REDIS_URL, **kwargs)
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
31
|
else:
|
35
32
|
redis_client = Redis(**kwargs) # decode_responses=True
|
36
33
|
redis_aclient = AsyncRedis(**kwargs)
|
@@ -76,9 +73,15 @@ if __name__ == '__main__':
|
|
76
73
|
#
|
77
74
|
# arun(redis_aclient.select(1))
|
78
75
|
|
76
|
+
# async def main():
|
77
|
+
# r = await redis_aclient.select(1)
|
78
|
+
# return await redis_aclient.get(task_id)
|
79
|
+
#
|
80
|
+
#
|
81
|
+
# arun(main())
|
82
|
+
|
79
83
|
async def main():
|
80
|
-
|
81
|
-
return await redis_aclient.get(task_id)
|
84
|
+
return await redis_aclient.lpop("redis_key")
|
82
85
|
|
83
86
|
|
84
87
|
arun(main())
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Project : AI. @by PyCharm
|
4
|
+
# @File : polling
|
5
|
+
# @Time : 2024/12/26 14:08
|
6
|
+
# @Author : betterme
|
7
|
+
# @WeChat : meutils
|
8
|
+
# @Software : PyCharm
|
9
|
+
# @Description :
|
10
|
+
import time
|
11
|
+
|
12
|
+
from meutils.pipe import *
|
13
|
+
|
14
|
+
|
15
|
+
def poll(n: int = 30, sleep_fn: Optional[Callable] = None):
|
16
|
+
if sleep_fn is None:
|
17
|
+
sleep_fn = lambda i: max(n / (i + 1), 1) # 预估大概 2~3 *n
|
18
|
+
|
19
|
+
def decorator(fn):
|
20
|
+
is_coroutine = inspect.iscoroutinefunction(fn)
|
21
|
+
|
22
|
+
@wraps(fn)
|
23
|
+
async def wrapper(*args, **kwargs):
|
24
|
+
for i in range(n):
|
25
|
+
await asyncio.sleep(sleep_fn(i))
|
26
|
+
# 根据函数类型选择调用方式
|
27
|
+
result = await fn(*args, **kwargs) if is_coroutine else fn(*args, **kwargs)
|
28
|
+
if result: # 跳出
|
29
|
+
return result
|
30
|
+
return None
|
31
|
+
|
32
|
+
return wrapper
|
33
|
+
|
34
|
+
return decorator
|
35
|
+
|
36
|
+
|
37
|
+
if __name__ == '__main__':
|
38
|
+
@poll(n=5)
|
39
|
+
async def check_something():
|
40
|
+
# 你的检查逻辑
|
41
|
+
|
42
|
+
logger.debug(time.ctime())
|
43
|
+
return {"status": "ok"}
|
44
|
+
|
45
|
+
|
46
|
+
arun(check_something())
|
meutils/init/evn.py
CHANGED
@@ -12,6 +12,7 @@ import mimetypes
|
|
12
12
|
from meutils.pipe import *
|
13
13
|
from meutils.io.files_utils import to_bytes
|
14
14
|
from meutils.llm.openai_utils import to_openai_params
|
15
|
+
from meutils.str_utils.regular_expression import parse_url
|
15
16
|
|
16
17
|
from openai import OpenAI, AsyncOpenAI
|
17
18
|
from meutils.schemas.openai_types import chat_completion, chat_completion_chunk, ChatCompletionRequest, CompletionUsage
|
@@ -66,6 +67,22 @@ class Completions(object):
|
|
66
67
|
|
67
68
|
request.messages = request.system_messages + [{'role': 'user', 'content': request.last_content}]
|
68
69
|
|
70
|
+
elif isinstance(request.last_content, str) and (urls := parse_url(request.last_content)):
|
71
|
+
logger.debug(urls)
|
72
|
+
|
73
|
+
url = urls[-1]
|
74
|
+
request.last_content = request.last_content.replace(url, '')
|
75
|
+
|
76
|
+
files = await asyncio.gather(*map(self.file_extract, urls))
|
77
|
+
|
78
|
+
for file_content in files:
|
79
|
+
request.system_messages.append({
|
80
|
+
"role": "system",
|
81
|
+
"content": file_content,
|
82
|
+
})
|
83
|
+
|
84
|
+
request.messages = request.system_messages + [{'role': 'user', 'content': request.last_content}]
|
85
|
+
|
69
86
|
logger.debug(request)
|
70
87
|
|
71
88
|
data = to_openai_params(request)
|
@@ -78,30 +95,43 @@ if __name__ == '__main__':
|
|
78
95
|
|
79
96
|
request = ChatCompletionRequest(
|
80
97
|
# model="qwen-turbo-2024-11-01",
|
81
|
-
model="claude-3-5-sonnet-20241022",
|
98
|
+
# model="claude-3-5-sonnet-20241022",
|
99
|
+
model="gpt-4o-mini",
|
100
|
+
|
82
101
|
messages=[
|
83
102
|
{
|
84
103
|
'role': 'system',
|
85
104
|
'content': '你是一个文件问答助手'
|
86
105
|
},
|
106
|
+
# {
|
107
|
+
# 'role': 'user',
|
108
|
+
# # 'content': {
|
109
|
+
# # "type": "file_url",
|
110
|
+
# # "file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
|
111
|
+
# # },
|
112
|
+
# 'content': [
|
113
|
+
# {
|
114
|
+
# "type": "text",
|
115
|
+
# "text": "这个文件讲了什么?"
|
116
|
+
# },
|
117
|
+
# # 多轮的时候要剔除
|
118
|
+
# {
|
119
|
+
# "type": "file_url",
|
120
|
+
# "file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
|
121
|
+
# }
|
122
|
+
# ]
|
123
|
+
# },
|
124
|
+
|
87
125
|
{
|
88
126
|
'role': 'user',
|
89
127
|
# 'content': {
|
90
128
|
# "type": "file_url",
|
91
129
|
# "file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
|
92
130
|
# },
|
93
|
-
'content':
|
94
|
-
|
95
|
-
"type": "text",
|
96
|
-
"text": "这个文件讲了什么?"
|
97
|
-
},
|
98
|
-
# 多轮的时候要剔除
|
99
|
-
{
|
100
|
-
"type": "file_url",
|
101
|
-
"file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
|
102
|
-
}
|
103
|
-
]
|
131
|
+
'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 这个文件讲了什么?",
|
132
|
+
|
104
133
|
},
|
134
|
+
|
105
135
|
# {'role': 'assistant', 'content': "好的"},
|
106
136
|
# {
|
107
137
|
# 'role': 'user',
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Project : AI. @by PyCharm
|
4
|
+
# @File : ark
|
5
|
+
# @Time : 2024/12/31 13:44
|
6
|
+
# @Author : betterme
|
7
|
+
# @WeChat : meutils
|
8
|
+
# @Software : PyCharm
|
9
|
+
# @Description :
|
10
|
+
import json
|
11
|
+
import os
|
12
|
+
|
13
|
+
from meutils.pipe import *
|
14
|
+
import volcenginesdkcore
|
15
|
+
from volcenginesdkcore.signv4 import SignerV4
|
16
|
+
import volcenginesdkark
|
17
|
+
|
18
|
+
# sign(path, method, headers, body, query, ak, sk, region, service)
|
19
|
+
|
20
|
+
headers = {}
|
21
|
+
payload = {
|
22
|
+
"Prompt": "关于星空的歌",
|
23
|
+
"Genre": "R&B/Soul",
|
24
|
+
"Mood": "Dynamic/Energetic",
|
25
|
+
"Gender": "Male",
|
26
|
+
"ModelVersion": "v4.0"
|
27
|
+
}
|
28
|
+
params = {"Action": "GenLyrics", "Version": "2024-08-12"}
|
29
|
+
SignerV4.sign(
|
30
|
+
path="/",
|
31
|
+
method="POST",
|
32
|
+
query=params,
|
33
|
+
body=json.dumps(payload),
|
34
|
+
headers=headers,
|
35
|
+
ak=os.getenv("ARK_ACCESS_KEY"),
|
36
|
+
sk=os.getenv("ARK_SECRET_ACCESS_KEY"),
|
37
|
+
region="cn-beijing",
|
38
|
+
service="imagination"
|
39
|
+
)
|
40
|
+
|
41
|
+
print(headers)
|
42
|
+
|
43
|
+
s = ''
|
44
|
+
for k, v in headers.items():
|
45
|
+
s += f"{k}:{v}\n"
|
46
|
+
|
47
|
+
print(s)
|