MeUtils 2024.12.26.22.14.1__py3-none-any.whl → 2025.1.3.14.11.44__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.26.22.14.1.dist-info → MeUtils-2025.1.3.14.11.44.dist-info}/METADATA +26 -26
- {MeUtils-2024.12.26.22.14.1.dist-info → MeUtils-2025.1.3.14.11.44.dist-info}/RECORD +30 -23
- examples/_openaisdk/openai_aiplus.py +54 -0
- examples/_openaisdk/openai_chatfire.py +4 -1
- examples/_openaisdk/openai_deepinfra.py +55 -0
- examples/_openaisdk/openai_gitee.py +33 -0
- examples/_openaisdk/openai_qwen.py +58 -0
- examples/_openaisdk/openai_zhipu.py +2 -0
- examples/_openaisdk/zhipu_/346/231/272/350/203/275/344/275/223.py +46 -0
- meutils/_utils.py +15 -1
- meutils/apis/images/recraft.py +2 -3
- meutils/apis/jimeng/images.py +24 -4
- meutils/apis/vidu/vidu_video.py +1 -1
- meutils/data/VERSION +1 -1
- meutils/data/oneapi/NOTICE.md +77 -38
- meutils/init/evn.py +1 -1
- 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/image_types.py +2 -0
- meutils/schemas/kuaishou_types.py +23 -6
- meutils/schemas/oneapi/common.py +40 -14
- meutils/schemas/openai_types.py +17 -6
- {MeUtils-2024.12.26.22.14.1.dist-info → MeUtils-2025.1.3.14.11.44.dist-info}/LICENSE +0 -0
- {MeUtils-2024.12.26.22.14.1.dist-info → MeUtils-2025.1.3.14.11.44.dist-info}/WHEEL +0 -0
- {MeUtils-2024.12.26.22.14.1.dist-info → MeUtils-2025.1.3.14.11.44.dist-info}/entry_points.txt +0 -0
- {MeUtils-2024.12.26.22.14.1.dist-info → MeUtils-2025.1.3.14.11.44.dist-info}/top_level.txt +0 -0
- /meutils/{jwt_utils → request_utils/jwt_utils}/__init__.py +0 -0
meutils/apis/vidu/vidu_video.py
CHANGED
@@ -218,7 +218,7 @@ if __name__ == '__main__':
|
|
218
218
|
# # token = "_ga=GA1.1.2058758439.1724312077; JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgzNTAzODAsImlhdCI6MTcyNzA1NDM4MCwiaXNzIjoiaWFtIiwic3ViIjoiMjQyMDA2NTAzNjA5MTgzOSJ9.PkjQqjYB56vYetYwmlagnWn_6bSCwoxCjI7BjfelBOU; Shunt=; sensorsdata2015jssdkcross=dfm-enc-%7B%22Va28a6y8_aV%22%3A%22sSsAAnHAInAGEtIG%22%2C%22gae28_aV%22%3A%22EGEuAnststSEirt-ARSAigSVHIiHVs-EtHsHnIR-sARInAA-EGEuAnststHsIti%22%2C%22OemO2%22%3A%7B%22%24ki8r28_8eiggay_2mbeyr_8cOr%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24ki8r28_2rieyz_lrcMmeV%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24ki8r28_ergreere%22%3A%22%22%7D%2C%22aVr68a8ar2%22%3A%22rc3liZ7ku67OV5kgPsGCiskkDskl3qmawFlJPq0swqfcpXNJPZKSBF0IQXLzWq7lQFQzQZNcBF1SQF3EQqwIBF3MQhwswX08wFlJPq0swqfcpXKcwhzz3aMax9klWZHAiD7HDsJCWskbDskl3qmawqNcwX0sQF0hQq0HwFfhp4xG%22%2C%22za28mec_kmfa6_aV%22%3A%7B%226ior%22%3A%22%24aVr68a8c_kmfa6_aV%22%2C%22Cikbr%22%3A%22sSsAAnHAInAGEtIG%22%7D%7D; _ga_ZJBV7VYP55=GS1.1.1727080335.38.1.1727080510.0.0.0"
|
219
219
|
# token = "JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgzNDkyNzQsImlhdCI6MTcyNzA1MzI3NCwiaXNzIjoiaWFtIiwic3ViIjoiMjQyMDg5NjA4MTIwNTkwNyJ9.MRXmSr48PifQgRN1-yTTu8d7Sq1An4OS7G5WoYpJ_PU"
|
220
220
|
|
221
|
-
token = "_ga=GA1.1.
|
221
|
+
token = "_ga=GA1.1.1191408146.1725443726; Shunt=; JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzY0NzgzODIsImlhdCI6MTczNTE4MjM4MiwiaXNzIjoiaWFtIiwic3ViIjoiMjU3NTg1MzI5MDUyNzYwNiJ9.AJBuQH0B9aQ2znnczYoqBw9YvHkLh0uZF0QQx5xdxrc; sensorsdata2015jssdkcross=dfm-enc-%7B%22Va28a6y8_aV%22%3A%22sHRHtHIsGAHsRnAn%22%2C%22gae28_aV%22%3A%22EGEuyRHVigIEtAG-AGRuSsHrVAGRuS-EtHsHnIR-sARInAA-EGEuyRHVigSEuIR%22%2C%22OemO2%22%3A%7B%22%24ki8r28_8eiggay_2mbeyr_8cOr%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24ki8r28_2rieyz_lrcMmeV%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24ki8r28_ergreere%22%3A%22z88O2%3A%2F%2Fiyymb682.fmmfkr.ymo%2F%22%7D%2C%22aVr68a8ar2%22%3A%22rc3liZ7ku67OV5kgPsGCiskkDskl3qmawFlJPowIQZ7zWqwJpX0HBF0HQs3AwqdkWX0HQs3ABF1SQF3EQqwIBF3MQhwswX08wFlJPowIQZ7zWqNJPqwI3aMax9klWZHAiD7HDsJCWskbDskl3qmawqKIQFfEwh3HwXKcQhPMQaxG%22%2C%22za28mec_kmfa6_aV%22%3A%7B%226ior%22%3A%22%24aVr68a8c_kmfa6_aV%22%2C%22Cikbr%22%3A%22sHRHtHIsGAHsRnAn%22%7D%7D; _ga_ZJBV7VYP55=GS1.1.1735182278.4.1.1735182405.26.0.0"
|
222
222
|
arun(check_token(token))
|
223
223
|
#
|
224
224
|
# FEISHU_URL = "https://xchatllm.feishu.cn/sheets/GYCHsvI4qhnDPNtI4VPcdw2knEd?sheet=rxldsA"
|
meutils/data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2025.01.03.14.11.44
|
meutils/data/oneapi/NOTICE.md
CHANGED
@@ -15,52 +15,79 @@
|
|
15
15
|
- 提供图片编辑服务,变清晰、去水印、抠图等等
|
16
16
|
- 提供文档智能服务,ocr/pdf-to-markdown/url-to-markdown等等
|
17
17
|
- 提供对象存储服务
|
18
|
-
|
18
|
+
|
19
19
|
- 账号服务(市面上有的都可以)
|
20
|
-
|
21
|
-
|
20
|
+
- gpt-plus/claude-pro
|
21
|
+
- api-key
|
22
22
|
|
23
23
|
- 个性化服务
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
- 定制同款api聚合站点,一键对接货源
|
25
|
+
- 定制企业智能体,类似gpt-4-all/kimi
|
26
|
+
- 定制知识库智能问答(RAG)
|
27
|
+
- 定制AI类网站/小程序等等
|
28
|
+
- 承接数据标注/数据跑批任务
|
29
|
+
- 承接大模型微调,定制化大模型(可端到端)
|
30
|
+
- 承接其他项目,算法模型等等
|
31
31
|
|
32
32
|
</details>
|
33
33
|
|
34
|
+
<details markdown="1">
|
35
|
+
<summary><b>预祝大家新年快乐🎁元旦礼物☺</b></summary>
|
36
|
+
|
37
|
+
- 联系企微客服
|
38
|
+
- 充值100-200 增送5%
|
39
|
+
- 充值200-500 增送10%
|
40
|
+
- 充值500-1000 增送15%
|
41
|
+
- 充值1000-2000 增送20%
|
42
|
+
|
43
|
+
</details>
|
44
|
+
|
45
|
+
## 2024-12-31
|
46
|
+
|
47
|
+
- 上线新模型
|
48
|
+
- `glm-zero/glm-zero-preview`:GLM-Zero-Preview 专注于增强模型推理能力,擅长处理数理逻辑、代码和需要深度推理的复杂问题。同基座模型相比,GLM-Zero-Preview
|
49
|
+
在不显著降低通用任务能力的情况下,在专家任务能力方面表现大幅提升。其在 AIME 2024、MATH500 和 LiveCodeBench 评测中,效果与
|
50
|
+
OpenAI-o1-Preview 相当。
|
51
|
+
- 兼容SparkAI客户端,文件问答&图片问答:baseurl改为`https://api.chatfire.cn/sparkai/v1`
|
52
|
+

|
53
|
+
|
54
|
+
## 2024-12-27
|
55
|
+
|
56
|
+
- 上线新模型
|
57
|
+
- deepseek-v3
|
58
|
+
- deepseek-r1:deepseek-v3的思考模型
|
59
|
+
- deepseek-search:deepseek-v3的联网模型
|
60
|
+
|
34
61
|
## 2024-12-24
|
62
|
+
|
35
63
|
- 上线新模型
|
36
|
-
|
37
|
-
|
64
|
+
- doubao-pro-256k:相比Doubao-pro-128k/240628,长文任务效果显著提升10%以上,要点提取、字数遵循、多轮对话上文记忆等能力大幅提升
|
65
|
+
- [qvq-72b-preview](https://mp.weixin.qq.com/s/WzL7tbFUZOgE2IFMeHT-sQ):Qwen开源视觉推理模型QVQ,更睿智地看世界!
|
38
66
|
|
39
67
|
- 增加gemini-2.0配额,支持多模型,默认分组可用
|
40
68
|
- "gemini-2.0-flash"
|
41
69
|
- "gemini-2.0-flash-exp"
|
42
70
|
|
43
|
-
|
44
71
|
## 2024-12-20
|
72
|
+
|
45
73
|
- 修复SunoV4无水印版本
|
46
|
-
|
74
|
+
- [异步任务接口文档](https://api.chatfire.cn/docs/api-246593467)
|
47
75
|
- [增加视频解析模型](https://api.chatfire.cn/docs/api-246688638)
|
48
76
|
- 增加高并发mj-fast
|
49
77
|
|
50
78
|
## 2024-12-19
|
79
|
+
|
51
80
|
- 新增生图模型 SeedEdit(文生图&图生图/图片编辑): 一句话编辑你的世界:字节跳动推出革命性图片编辑工具SeedEdit
|
52
|
-
|
53
|
-
|
54
|
-
|
81
|
+
- [Chat模式接口文档](https://api.chatfire.cn/docs/api-214415540)
|
82
|
+
- [Images接口文档](https://api.chatfire.cn/docs/api-246137616)
|
83
|
+
- [异步任务接口文档](https://api.chatfire.cn/docs/api-246120232)
|
55
84
|
- 新增视觉模型
|
56
|
-
|
57
|
-
|
58
|
-
|
85
|
+
- deepseek-ai/deepseek-vl2
|
86
|
+
- doubao-vision-pro-32k
|
87
|
+
- doubao-vision-lite-32k
|
59
88
|
- 新增视频模型 Sora
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
89
|
+
- Chat模式:`sora-1:1-480p-5s`
|
90
|
+
- 异步任务接口在路上
|
64
91
|
|
65
92
|
---
|
66
93
|
|
@@ -68,34 +95,46 @@
|
|
68
95
|
<summary><b>历史更新</b></summary>
|
69
96
|
|
70
97
|
## 2024-12-13
|
98
|
+
|
71
99
|
- 新增模型 混元视频(支持高并发,非逆向可商用,限时特价1毛)[接口文档](https://api.chatfire.cn/docs/api-244309840)
|
72
|
-
HunyuanVideo 是腾讯推出的开源视频生成基础模型,拥有超过 130
|
100
|
+
HunyuanVideo 是腾讯推出的开源视频生成基础模型,拥有超过 130
|
101
|
+
亿参数,是目前最大的开源视频生成模型。该模型采用统一的图像和视频生成架构,集成了数据整理、图像-视频联合模型训练和高效基础设施等关键技术。模型使用多模态大语言模型作为文本编码器,通过
|
102
|
+
3D VAE 进行空间-时间压缩,并提供提示词重写功能。根据专业人工评估结果,HunyuanVideo 在文本对齐、运动质量和视觉质量等方面的表现优于现有最先进的模型
|
73
103
|
|
74
104
|
## 2024-12-09
|
105
|
+
|
75
106
|
- 新增模型
|
76
|
-
|
77
|
-
|
78
|
-
|
107
|
+
- meta-llama/Llama-3.3-70B-Instruct: Llama 3.3 是 Llama 系列最先进的多语言开源大型语言模型,以极低成本体验媲美 405B
|
108
|
+
模型的性能。基于 Transformer
|
109
|
+
结构,并通过监督微调(SFT)和人类反馈强化学习(RLHF)提升有用性和安全性。其指令调优版本专为多语言对话优化,在多项行业基准上表现优于众多开源和封闭聊天模型。知识截止日期为
|
110
|
+
2023 年 12 月。
|
111
|
+
- jimeng-v2.1:豆包画图,支持即梦超强图像生成能力,兼容chat/dalle-image调用方式。
|
112
|
+
- 海螺最新的I2V-01-live图生视频模型:特别针对二次元图生视频效果,进行了优化,动作流畅又生动,让2D二次元角色像复活一样。
|
79
113
|
|
80
114
|
## 2024-12-06
|
115
|
+
|
81
116
|
- 新增模型
|
82
|
-
|
83
|
-
|
117
|
+
- o1-plus: (官网 plus 版本 `逆向工程`,有思考过程显示)o1 是OpenAI针对复杂任务的新推理模型,该任务需要广泛的常识。该模型具有
|
118
|
+
200k 上下文,目前全球最强模型,支持图片识别
|
119
|
+
- o1-pro: (官网 200刀 plus 版本 `逆向工程`,有思考过程显示)o1-pro 是OpenAI针对复杂任务的新推理模型,该任务需要广泛的常识。该模型具有
|
120
|
+
200k 上下文,目前全球最强模型,支持图片识别
|
84
121
|
|
85
122
|
## 2024-12-05
|
123
|
+
|
86
124
|
- 新增模型gpt-4-plus/gpt-4o-plus按倍率计算
|
87
125
|
> OpenAI-plus会员 逆向工程
|
88
|
-
|
126
|
+
|
89
127
|
## 2024-11-29
|
90
|
-
- 新增推理模型
|
91
|
-
- Qwen/QwQ-32B-Preview
|
92
|
-
> 强大的数学问题解决能力,在AIME、MATH-500数学评测上,超过了OpenAI o1-preview优秀的编码能力,LiveCodeBench接近OpenAI o1-preview
|
93
128
|
|
94
|
-
|
95
|
-
-
|
96
|
-
|
97
|
-
|
129
|
+
- 新增推理模型
|
130
|
+
- Qwen/QwQ-32B-Preview
|
131
|
+
> 强大的数学问题解决能力,在AIME、MATH-500数学评测上,超过了OpenAI o1-preview优秀的编码能力,LiveCodeBench接近OpenAI
|
132
|
+
o1-preview
|
98
133
|
|
134
|
+
## 2024-11-25
|
99
135
|
|
136
|
+
- 新增虚拟换衣接口
|
137
|
+
- [可灵官方api格式](https://api.chatfire.cn/docs/api-237182295) 0.8/次
|
138
|
+
- [老接口格式](https://api.chatfire.cn/docs/api-226983436) 0.1/次
|
100
139
|
|
101
140
|
</details>
|
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)
|
@@ -0,0 +1,160 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Project : AI. @by PyCharm
|
4
|
+
# @File : volc
|
5
|
+
# @Time : 2024/12/31 13:20
|
6
|
+
# @Author : betterme
|
7
|
+
# @WeChat : meutils
|
8
|
+
# @Software : PyCharm
|
9
|
+
# @Description :
|
10
|
+
|
11
|
+
|
12
|
+
import hashlib
|
13
|
+
import hmac
|
14
|
+
import os
|
15
|
+
from urllib.parse import quote
|
16
|
+
|
17
|
+
from meutils.pipe import *
|
18
|
+
|
19
|
+
# 以下参数视服务不同而不同,一个服务内通常是一致的
|
20
|
+
Service = "iam"
|
21
|
+
Version = "2018-01-01"
|
22
|
+
Region = "cn-beijing"
|
23
|
+
Host = "iam.volcengineapi.com"
|
24
|
+
ContentType = "application/x-www-form-urlencoded"
|
25
|
+
|
26
|
+
# 请求的凭证,从IAM或者STS服务中获取
|
27
|
+
AK = os.getenv("ARK_ACCESS_KEY")
|
28
|
+
SK = os.getenv("ARK_SECRET_ACCESS_KEY")
|
29
|
+
# 当使用临时凭证时,需要使用到SessionToken传入Header,并计算进SignedHeader中,请自行在header参数中添加X-Security-Token头
|
30
|
+
# SessionToken = ""
|
31
|
+
|
32
|
+
|
33
|
+
def norm_query(params):
|
34
|
+
query = ""
|
35
|
+
for key in sorted(params.keys()):
|
36
|
+
if type(params[key]) == list:
|
37
|
+
for k in params[key]:
|
38
|
+
query = (
|
39
|
+
query + quote(key, safe="-_.~") + "=" + quote(k, safe="-_.~") + "&"
|
40
|
+
)
|
41
|
+
else:
|
42
|
+
query = (query + quote(key, safe="-_.~") + "=" + quote(params[key], safe="-_.~") + "&")
|
43
|
+
query = query[:-1]
|
44
|
+
return query.replace("+", "%20")
|
45
|
+
|
46
|
+
|
47
|
+
# 第一步:准备辅助函数。
|
48
|
+
# sha256 非对称加密
|
49
|
+
def hmac_sha256(key: bytes, content: str):
|
50
|
+
return hmac.new(key, content.encode("utf-8"), hashlib.sha256).digest()
|
51
|
+
|
52
|
+
|
53
|
+
# sha256 hash算法
|
54
|
+
def hash_sha256(content: str):
|
55
|
+
return hashlib.sha256(content.encode("utf-8")).hexdigest()
|
56
|
+
|
57
|
+
|
58
|
+
# 第二步:签名请求函数
|
59
|
+
def request(method, date, query, header, ak, sk, action, body):
|
60
|
+
# 第三步:创建身份证明。其中的 Service 和 Region 字段是固定的。ak 和 sk 分别代表
|
61
|
+
# AccessKeyID 和 SecretAccessKey。同时需要初始化签名结构体。一些签名计算时需要的属性也在这里处理。
|
62
|
+
# 初始化身份证明结构体
|
63
|
+
credential = {
|
64
|
+
"access_key_id": ak,
|
65
|
+
"secret_access_key": sk,
|
66
|
+
"service": Service,
|
67
|
+
"region": Region,
|
68
|
+
}
|
69
|
+
# 初始化签名结构体
|
70
|
+
request_param = {
|
71
|
+
"body": body,
|
72
|
+
"host": Host,
|
73
|
+
"path": "/",
|
74
|
+
"method": method,
|
75
|
+
"content_type": ContentType,
|
76
|
+
"date": date,
|
77
|
+
"query": {"Action": action, "Version": Version, **query},
|
78
|
+
}
|
79
|
+
if body is None:
|
80
|
+
request_param["body"] = ""
|
81
|
+
# 第四步:接下来开始计算签名。在计算签名前,先准备好用于接收签算结果的 signResult 变量,并设置一些参数。
|
82
|
+
# 初始化签名结果的结构体
|
83
|
+
x_date = request_param["date"].strftime("%Y%m%dT%H%M%SZ")
|
84
|
+
short_x_date = x_date[:8]
|
85
|
+
x_content_sha256 = hash_sha256(request_param["body"])
|
86
|
+
sign_result = {
|
87
|
+
"Host": request_param["host"],
|
88
|
+
"X-Content-Sha256": x_content_sha256,
|
89
|
+
"X-Date": x_date,
|
90
|
+
"Content-Type": request_param["content_type"],
|
91
|
+
}
|
92
|
+
# 第五步:计算 Signature 签名。
|
93
|
+
signed_headers_str = ";".join(
|
94
|
+
["content-type", "host", "x-content-sha256", "x-date"]
|
95
|
+
)
|
96
|
+
# signed_headers_str = signed_headers_str + ";x-security-token"
|
97
|
+
canonical_request_str = "\n".join(
|
98
|
+
[request_param["method"].upper(),
|
99
|
+
request_param["path"],
|
100
|
+
norm_query(request_param["query"]),
|
101
|
+
"\n".join(
|
102
|
+
[
|
103
|
+
"content-type:" + request_param["content_type"],
|
104
|
+
"host:" + request_param["host"],
|
105
|
+
"x-content-sha256:" + x_content_sha256,
|
106
|
+
"x-date:" + x_date,
|
107
|
+
]
|
108
|
+
),
|
109
|
+
"",
|
110
|
+
signed_headers_str,
|
111
|
+
x_content_sha256,
|
112
|
+
]
|
113
|
+
)
|
114
|
+
|
115
|
+
# 打印正规化的请求用于调试比对
|
116
|
+
print(canonical_request_str)
|
117
|
+
hashed_canonical_request = hash_sha256(canonical_request_str)
|
118
|
+
|
119
|
+
# 打印hash值用于调试比对
|
120
|
+
print(hashed_canonical_request)
|
121
|
+
credential_scope = "/".join([short_x_date, credential["region"], credential["service"], "request"])
|
122
|
+
string_to_sign = "\n".join(["HMAC-SHA256", x_date, credential_scope, hashed_canonical_request])
|
123
|
+
|
124
|
+
# 打印最终计算的签名字符串用于调试比对
|
125
|
+
print(string_to_sign)
|
126
|
+
k_date = hmac_sha256(credential["secret_access_key"].encode("utf-8"), short_x_date)
|
127
|
+
k_region = hmac_sha256(k_date, credential["region"])
|
128
|
+
k_service = hmac_sha256(k_region, credential["service"])
|
129
|
+
k_signing = hmac_sha256(k_service, "request")
|
130
|
+
signature = hmac_sha256(k_signing, string_to_sign).hex()
|
131
|
+
|
132
|
+
sign_result["Authorization"] = "HMAC-SHA256 Credential={}, SignedHeaders={}, Signature={}".format(
|
133
|
+
credential["access_key_id"] + "/" + credential_scope,
|
134
|
+
signed_headers_str,
|
135
|
+
signature,
|
136
|
+
)
|
137
|
+
header = {**header, **sign_result}
|
138
|
+
# header = {**header, **{"X-Security-Token": SessionToken}}
|
139
|
+
# 第六步:将 Signature 签名写入 HTTP Header 中,并发送 HTTP 请求。
|
140
|
+
r = requests.request(method=method,
|
141
|
+
url="https://{}{}".format(request_param["host"], request_param["path"]),
|
142
|
+
headers=header,
|
143
|
+
params=request_param["query"],
|
144
|
+
data=request_param["body"],
|
145
|
+
)
|
146
|
+
return r.json()
|
147
|
+
|
148
|
+
|
149
|
+
if __name__ == "__main__":
|
150
|
+
# response_body = request("Get", datetime.datetime.utcnow(), {}, {}, AK, SK, "ListUsers", None)
|
151
|
+
# print(response_body)
|
152
|
+
|
153
|
+
now = datetime.datetime.utcnow()
|
154
|
+
|
155
|
+
# Body的格式需要配合Content-Type,API使用的类型请阅读具体的官方文档,如:json格式需要json.dumps(obj)
|
156
|
+
# response_body = request("GET", now, {"Limit": "2"}, {}, AK, SK, "ListUsers", None)
|
157
|
+
# print(response_body)
|
158
|
+
|
159
|
+
response_body = request("POST", now, {"Limit": "10"}, {}, AK, SK, "ListUsers", "UnUseParam=ASDF")
|
160
|
+
print(response_body)
|
meutils/schemas/image_types.py
CHANGED
@@ -112,7 +112,8 @@ class KlingaiImageRequest(BaseModel):
|
|
112
112
|
{'name': 'aspect_ratio', 'value': self.aspect_ratio or "1:1"},
|
113
113
|
{'name': 'imageCount', 'value': self.n},
|
114
114
|
{"name": "fidelity", "value": self.image_fidelity or 0.5},
|
115
|
-
{'name': 'biz', 'value': 'klingai'}
|
115
|
+
{'name': 'biz', 'value': 'klingai'},
|
116
|
+
{"name": "kolors_version", "value": "1.5"}
|
116
117
|
]
|
117
118
|
self.payload = {
|
118
119
|
'arguments': arguments,
|
@@ -162,13 +163,29 @@ class Camera(BaseModel):
|
|
162
163
|
|
163
164
|
|
164
165
|
class KlingaiVideoRequest(BaseModel):
|
165
|
-
|
166
|
+
"""增加计费模式,支持高质量模式
|
167
|
+
kling-v1.0-std-5s
|
168
|
+
|
169
|
+
kling-v1.5-std-5s 20积分
|
170
|
+
kling-v1.5-std-10s
|
171
|
+
|
172
|
+
kling-v1.5-pro-5s 35积分
|
173
|
+
kling-v1.5-pro-10s
|
174
|
+
|
175
|
+
kling-v1.6-std-5s 20积分
|
176
|
+
kling-v1.6-std-10s
|
177
|
+
|
178
|
+
kling-v1.6-pro-5s 35积分
|
179
|
+
kling-v1.6-pro-10s
|
180
|
+
|
181
|
+
"""
|
182
|
+
model: str = 'kling-v1.6'
|
166
183
|
mode: Literal["mini", "std", "pro"] = "std"
|
167
184
|
|
168
185
|
prompt: str = ''
|
169
186
|
negative_prompt: Optional[str] = '' # 不希望出现的内容
|
170
187
|
|
171
|
-
n:
|
188
|
+
n: Literal[1, 2, 3, 4] = 1
|
172
189
|
|
173
190
|
duration: Optional[int] = 5
|
174
191
|
aspect_ratio: Literal["1:1", "2:3", "3:2", "3:4", "4:3", "9:16", "16:9"] = "16:9"
|
@@ -205,9 +222,9 @@ class KlingaiVideoRequest(BaseModel):
|
|
205
222
|
{'name': 'biz', 'value': 'klingai'},
|
206
223
|
]
|
207
224
|
|
208
|
-
kling_version = '1.
|
209
|
-
if self.model == 'kling-v1.
|
210
|
-
kling_version = "1.
|
225
|
+
kling_version = '1.5'
|
226
|
+
if self.model == 'kling-v1.6':
|
227
|
+
kling_version = "1.6"
|
211
228
|
self.mode = 'pro'
|
212
229
|
arguments.append({"name": "camera_control_enabled", "value": "false"}) # 暂不支持
|
213
230
|
else:
|