lesscode-flask 0.1.65__tar.gz → 0.1.67__tar.gz
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.
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/PKG-INFO +1 -1
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/__init__.py +1 -1
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/app.py +1 -1
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/user.py +9 -2
- lesscode_flask-0.1.67/lesscode_flask/utils/dify.py +351 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/PKG-INFO +1 -1
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/SOURCES.txt +1 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/README.md +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/db/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/db/datasource.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/db/executor.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/export_data/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/export_data/data_download_handler.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/log/access_log_handler.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/access_log.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/base_model.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/parameterized_query.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/resource_param_template.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/response_result.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/service/access_log_service.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/service/base_service.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/service/resource_param_template_service.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/setting/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/setup/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/signals.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/static/swagger.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/decorator/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/decorator/cache.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/decorator/swagger.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/file/file_exporter.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/file/file_utils.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/helpers.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/oss/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/redis/redis_helper.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/request/request.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/task/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/task/task_helper.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/thread/thread_utils.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/wsgi.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/dependency_links.txt +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/requires.txt +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/top_level.txt +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/clickhouse.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/elasticsearch.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/kingbase.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/mysql.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/pg.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/settings/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/settings/helpers.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/utils/__init__.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/utils/requests_session.py +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/setup.cfg +0 -0
- {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/setup.py +0 -0
|
@@ -75,7 +75,7 @@ class Lesscoder(Flask):
|
|
|
75
75
|
elif str(access) == "2": # 需要权限
|
|
76
76
|
if current_user.is_anonymous_user:
|
|
77
77
|
ResponseResult.fail("请登录后访问", status_code="403", http_code="403")
|
|
78
|
-
if not current_user.has_permission(
|
|
78
|
+
if not current_user.has_permission(url):
|
|
79
79
|
ResponseResult.fail("请获取授权后访问", status_code="403", http_code="403")
|
|
80
80
|
return v
|
|
81
81
|
|
|
@@ -13,18 +13,24 @@ except ImportError as e:
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class PermissionsCheckMixin:
|
|
16
|
+
|
|
16
17
|
def has_permission(self, permission):
|
|
17
18
|
return self.has_permissions((permission,))
|
|
18
19
|
|
|
19
20
|
def has_permissions(self, permissions):
|
|
20
21
|
has_permissions = reduce(
|
|
21
22
|
lambda a, b: a and b,
|
|
22
|
-
[permission in self.
|
|
23
|
+
[permission in self.permissions_url for permission in permissions],
|
|
23
24
|
True,
|
|
24
25
|
)
|
|
25
26
|
|
|
26
27
|
return has_permissions
|
|
27
28
|
|
|
29
|
+
# 权限集合(symbol)
|
|
30
|
+
permissions = []
|
|
31
|
+
# 权限集合(url)
|
|
32
|
+
permissions_url = []
|
|
33
|
+
|
|
28
34
|
|
|
29
35
|
class User(flask_login.UserMixin, PermissionsCheckMixin):
|
|
30
36
|
"""
|
|
@@ -33,7 +39,8 @@ class User(flask_login.UserMixin, PermissionsCheckMixin):
|
|
|
33
39
|
|
|
34
40
|
def __init__(self, id="AnonymousUserId", username="AnonymousUser", display_name="匿名用户", phone_no: str = None,
|
|
35
41
|
email: str = None,
|
|
36
|
-
type: int = 0, account_status: str = None, permissions=[], permissions_url=[],roleIds=[],
|
|
42
|
+
type: int = 0, account_status: str = None, permissions=[], permissions_url=[], roleIds=[],
|
|
43
|
+
client_id: str = None,
|
|
37
44
|
sub: str = None):
|
|
38
45
|
# '账号id',
|
|
39
46
|
self.id = id
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import uuid
|
|
3
|
+
|
|
4
|
+
import requests
|
|
5
|
+
from flask import current_app
|
|
6
|
+
|
|
7
|
+
from lesscode_flask.model.user import flask_login
|
|
8
|
+
from lesscode_flask.utils.helpers import app_config
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# def dify_messages(dify_server_url: str, api_key, query: str = None, inputs: dict = None, response_mode="streaming",
|
|
12
|
+
# mode: str = "chat", user_id: str = None, conversation_id: str = ""):
|
|
13
|
+
# """
|
|
14
|
+
# 调用dify 的应用api接口
|
|
15
|
+
#
|
|
16
|
+
# :param dify_server_url: dify服务地址
|
|
17
|
+
# :param api_key: api key
|
|
18
|
+
# :param query: 用户查询语句
|
|
19
|
+
# :param inputs: 调用参数
|
|
20
|
+
# :param response_mode: 响应类型 streaming:流式
|
|
21
|
+
# :param mode: 应用类型(# 聊天助手:chat 文本生成:completion 聊天流程:advanced-chat 工作流:workflow Agent:agent-chat)
|
|
22
|
+
# :param user_id: 调用人user_id
|
|
23
|
+
# :return:
|
|
24
|
+
# """
|
|
25
|
+
# if user_id is None:
|
|
26
|
+
# user_id = uuid.uuid4().hex
|
|
27
|
+
# data = {
|
|
28
|
+
# "inputs": inputs,
|
|
29
|
+
# "response_mode": response_mode,
|
|
30
|
+
# "user": user_id,
|
|
31
|
+
# "conversation_id": conversation_id
|
|
32
|
+
# }
|
|
33
|
+
# if "chat" in mode: # 聊天
|
|
34
|
+
# data["query"] = query
|
|
35
|
+
# server_url = dify_server_url + "/v1/chat-messages"
|
|
36
|
+
# elif mode == "completion": # 文本生成
|
|
37
|
+
# if inputs is None:
|
|
38
|
+
# inputs = {"query": query}
|
|
39
|
+
# data["inputs"] = inputs
|
|
40
|
+
# server_url = dify_server_url + "/v1/completion-messages"
|
|
41
|
+
# elif mode == "workflow": # 工作流
|
|
42
|
+
# server_url = dify_server_url + "/v1/workflows/run"
|
|
43
|
+
# headers = {
|
|
44
|
+
# 'Authorization': f'Bearer {api_key}',
|
|
45
|
+
# 'Content-Type': 'application/json'
|
|
46
|
+
# }
|
|
47
|
+
# try:
|
|
48
|
+
# response = requests.post(server_url, headers=headers, json=data, stream=True)
|
|
49
|
+
# for line in response.iter_lines(decode_unicode=True):
|
|
50
|
+
# if line and line != "event: ping": # 过滤掉空行和ping事件
|
|
51
|
+
# if not line.startswith("data: "):
|
|
52
|
+
# message_error = {"event": "message_error", "message": line}
|
|
53
|
+
# yield f'data: {json.dumps(message_error)}\n\n'
|
|
54
|
+
# break
|
|
55
|
+
# yield f"{line}\n\n"
|
|
56
|
+
# except Exception as e:
|
|
57
|
+
# print(f"Error: {e}")
|
|
58
|
+
# yield 'data: {"event": "message_end"}'
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# def get_app_key(app_id):
|
|
62
|
+
# difyAppKey = DifyAppKeyService().get_item(app_id)
|
|
63
|
+
# if difyAppKey is None:
|
|
64
|
+
# return "应用不存在"
|
|
65
|
+
# API_KEY = difyAppKey.get("dify_api_key")
|
|
66
|
+
# return API_KEY
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def dify_chat_messages(api_key, query: str = None, inputs: dict = None, conversation_id: str = "", files=None,
|
|
70
|
+
response_mode="streaming", user_id: str = None, server_url: str = None):
|
|
71
|
+
"""
|
|
72
|
+
发送对话消息
|
|
73
|
+
:param api_key: API 秘钥
|
|
74
|
+
:param query: 用户查询语句
|
|
75
|
+
:param inputs: 调用参数
|
|
76
|
+
:param conversation_id: 会话 ID
|
|
77
|
+
:param files: 文件列表,适用于传入文件结合文本理解并回答问题
|
|
78
|
+
:param server_url:模型服务地址
|
|
79
|
+
:param response_mode: 响应类型 streaming:流式 ,blocking 阻塞式
|
|
80
|
+
:param user_id: 调用人user_id
|
|
81
|
+
:return:
|
|
82
|
+
"""
|
|
83
|
+
if server_url is None:
|
|
84
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
85
|
+
if user_id is None:
|
|
86
|
+
user_id = uuid.uuid4().hex
|
|
87
|
+
data = {
|
|
88
|
+
"inputs": inputs,
|
|
89
|
+
"query": query,
|
|
90
|
+
"response_mode": response_mode,
|
|
91
|
+
"conversation_id": conversation_id,
|
|
92
|
+
"user": user_id,
|
|
93
|
+
"files": files
|
|
94
|
+
# "files": [
|
|
95
|
+
# {
|
|
96
|
+
# "type": "image",
|
|
97
|
+
# "transfer_method": "remote_url",
|
|
98
|
+
# "url": "https://cloud.dify.ai/logo/logo-site.png"
|
|
99
|
+
# }
|
|
100
|
+
# ]
|
|
101
|
+
}
|
|
102
|
+
# if files is not None:
|
|
103
|
+
# data["files"] = files
|
|
104
|
+
# if "chat" in mode: # 聊天
|
|
105
|
+
# data["query"] = query
|
|
106
|
+
# server_url = server_url + "/v1/chat-messages"
|
|
107
|
+
# elif mode == "completion": # 文本生成
|
|
108
|
+
# if inputs is None:
|
|
109
|
+
# inputs = {"query": query}
|
|
110
|
+
# data["inputs"] = inputs
|
|
111
|
+
# server_url = server_url + "/v1/completion-messages"
|
|
112
|
+
# elif mode == "workflow": # 工作流
|
|
113
|
+
# server_url = server_url + "/v1/workflows/run"
|
|
114
|
+
headers = {
|
|
115
|
+
'Authorization': f'Bearer {api_key}',
|
|
116
|
+
'Content-Type': 'application/json'
|
|
117
|
+
}
|
|
118
|
+
try:
|
|
119
|
+
response = requests.post(f"{server_url}/v1/chat-messages", headers=headers, json=data, stream=True)
|
|
120
|
+
if "streaming" == response_mode:
|
|
121
|
+
pass
|
|
122
|
+
for line in response.iter_lines(decode_unicode=True):
|
|
123
|
+
if line and line != "event: ping": # 过滤掉空行和ping事件
|
|
124
|
+
if not line.startswith("data: "):
|
|
125
|
+
message_error = {"event": "message_error", "message": line}
|
|
126
|
+
yield f'data: {json.dumps(message_error)}\n\n'
|
|
127
|
+
break
|
|
128
|
+
yield f"{line}\n\n"
|
|
129
|
+
else: # blocking
|
|
130
|
+
res = response.text
|
|
131
|
+
yield res
|
|
132
|
+
except Exception as e:
|
|
133
|
+
if "streaming" == response_mode:
|
|
134
|
+
print(f"Error: {e}")
|
|
135
|
+
yield 'data: {"event": "message_end"}'
|
|
136
|
+
else: # blocking
|
|
137
|
+
return f'{{"event": "message", "answer": "{e}"}}'
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def dify_stop_messages(api_key: str, task_id: str, user_id=None, server_url: str = None):
|
|
141
|
+
"""
|
|
142
|
+
停止响应 仅支持流式模式。
|
|
143
|
+
:param api_key: API 秘钥
|
|
144
|
+
:param task_id: 任务 ID,可在流式返回 Chunk 中获取
|
|
145
|
+
:param user_id: 调用人user_id
|
|
146
|
+
:param server_url: 模型服务地址
|
|
147
|
+
:return:
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
if user_id is None:
|
|
151
|
+
user_id = uuid.uuid4().hex
|
|
152
|
+
data = {
|
|
153
|
+
"user": user_id
|
|
154
|
+
}
|
|
155
|
+
headers = {
|
|
156
|
+
'Authorization': f'Bearer {api_key}',
|
|
157
|
+
'Content-Type': 'application/json'
|
|
158
|
+
}
|
|
159
|
+
if server_url is None:
|
|
160
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
161
|
+
try:
|
|
162
|
+
requests.post(f"{server_url}/v1/chat-messages/{task_id}/stop", headers=headers, json=data, stream=False)
|
|
163
|
+
finally:
|
|
164
|
+
# 接口固定返回success
|
|
165
|
+
return {
|
|
166
|
+
"result": "success"
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def dify_feedbacks(api_key: str, messages_id: str, rating: int, user_id=None, server_url: str = None):
|
|
171
|
+
"""
|
|
172
|
+
用户反馈 点赞
|
|
173
|
+
:param api_key: API 秘钥
|
|
174
|
+
:param messages_id: 消息id
|
|
175
|
+
:param rating: 评价 0:取消 1:like 2:dislike
|
|
176
|
+
:param user_id: 调用人user_id
|
|
177
|
+
:param server_url: 模型服务地址
|
|
178
|
+
:return:
|
|
179
|
+
"""
|
|
180
|
+
if user_id is None:
|
|
181
|
+
user_id = uuid.uuid4().hex
|
|
182
|
+
data = {
|
|
183
|
+
"user": user_id
|
|
184
|
+
}
|
|
185
|
+
if server_url is None:
|
|
186
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
187
|
+
if rating == 0:
|
|
188
|
+
data["rating"] = None
|
|
189
|
+
elif rating == 1:
|
|
190
|
+
data["rating"] = "like"
|
|
191
|
+
elif rating == 2:
|
|
192
|
+
data["rating"] = "dislike"
|
|
193
|
+
headers = {
|
|
194
|
+
'Authorization': f'Bearer {api_key}',
|
|
195
|
+
'Content-Type': 'application/json'
|
|
196
|
+
}
|
|
197
|
+
try:
|
|
198
|
+
requests.post(f"{server_url}/v1/messages/{messages_id}/feedbacks", headers=headers, json=data, stream=False)
|
|
199
|
+
finally:
|
|
200
|
+
# 接口固定返回success
|
|
201
|
+
return {
|
|
202
|
+
"result": "success"
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def dify_history_messages(api_key: str, conversation_id: str, limit: int = 20, first_id: str = None, user_id=None,
|
|
207
|
+
server_url: str = None):
|
|
208
|
+
"""
|
|
209
|
+
获取会话历史消息
|
|
210
|
+
:param api_key: API 秘钥
|
|
211
|
+
:param conversation_id: 会话 ID
|
|
212
|
+
:param first_id: 当前页第一条聊天记录的 ID,默认 null
|
|
213
|
+
:param limit: 一次请求返回多少条聊天记录,默认 20 条。
|
|
214
|
+
:param user_id: 调用人user_id
|
|
215
|
+
:param server_url: 模型服务地址
|
|
216
|
+
:return:
|
|
217
|
+
"""
|
|
218
|
+
if user_id is None:
|
|
219
|
+
user_id = uuid.uuid4().hex
|
|
220
|
+
data = {
|
|
221
|
+
"user": user_id,
|
|
222
|
+
"conversation_id": conversation_id,
|
|
223
|
+
"limit": limit,
|
|
224
|
+
"first_id": first_id
|
|
225
|
+
}
|
|
226
|
+
if server_url is None:
|
|
227
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
228
|
+
headers = {
|
|
229
|
+
'Authorization': f'Bearer {api_key}',
|
|
230
|
+
'Content-Type': 'application/json'
|
|
231
|
+
}
|
|
232
|
+
response = requests.get(f"{server_url}/v1/messages", headers=headers, params=data)
|
|
233
|
+
return response.json()
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def dify_history_conversations(api_key: str, conversation_id: str, limit: int = 20, last_id: str = None, user_id=None,
|
|
237
|
+
server_url: str = None):
|
|
238
|
+
"""
|
|
239
|
+
获取历史会话列表
|
|
240
|
+
获取当前用户的会话列表,默认返回最近的 20 条。
|
|
241
|
+
:param api_key: API 秘钥
|
|
242
|
+
:param conversation_id: 会话 ID
|
|
243
|
+
:param last_id: (选填)当前页最后面一条记录的 ID,默认 null
|
|
244
|
+
:param limit: 一次请求返回多少条记录,默认 20 条,最大 100 条,最小 1 条。
|
|
245
|
+
:param sort_by: 排序字段,默认 -updated_at(按更新时间倒序排列) 可选值:created_at, -created_at, updated_at, -updated_at 字段前面的符号代表顺序或倒序,-代表倒序
|
|
246
|
+
:param user_id: 调用人user_id
|
|
247
|
+
:param server_url: 模型服务地址
|
|
248
|
+
:return:
|
|
249
|
+
"""
|
|
250
|
+
if user_id is None:
|
|
251
|
+
user_id = uuid.uuid4().hex
|
|
252
|
+
data = {
|
|
253
|
+
"user": user_id,
|
|
254
|
+
"conversation_id": conversation_id,
|
|
255
|
+
"limit": limit,
|
|
256
|
+
"last_id": last_id
|
|
257
|
+
}
|
|
258
|
+
if server_url is None:
|
|
259
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
260
|
+
headers = {
|
|
261
|
+
'Authorization': f'Bearer {api_key}',
|
|
262
|
+
'Content-Type': 'application/json'
|
|
263
|
+
}
|
|
264
|
+
response = requests.get(f"{server_url}/v1/conversations", headers=headers, params=data)
|
|
265
|
+
return response.json()
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def dify_delete_conversations(api_key: str, conversation_id: str, user_id=None,
|
|
269
|
+
server_url: str = None):
|
|
270
|
+
"""
|
|
271
|
+
删除会话
|
|
272
|
+
获取当前用户的会话列表,默认返回最近的 20 条。
|
|
273
|
+
:param api_key: API 秘钥
|
|
274
|
+
:param conversation_id: 会话 ID
|
|
275
|
+
:param user_id: 调用人user_id
|
|
276
|
+
:param server_url: 模型服务地址
|
|
277
|
+
:return:
|
|
278
|
+
"""
|
|
279
|
+
if user_id is None:
|
|
280
|
+
user_id = uuid.uuid4().hex
|
|
281
|
+
data = {
|
|
282
|
+
"user": user_id,
|
|
283
|
+
"conversation_id": conversation_id
|
|
284
|
+
}
|
|
285
|
+
if server_url is None:
|
|
286
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
287
|
+
headers = {
|
|
288
|
+
'Authorization': f'Bearer {api_key}',
|
|
289
|
+
'Content-Type': 'application/json'
|
|
290
|
+
}
|
|
291
|
+
response = requests.delete(f"{server_url}/v1/conversations", headers=headers, params=data)
|
|
292
|
+
return response.json()
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def dify_conversations_rename(api_key: str, conversation_id: str, name: str = None, auto_generate=False, user_id=None,
|
|
296
|
+
server_url: str = None):
|
|
297
|
+
"""
|
|
298
|
+
会话重命名
|
|
299
|
+
:param api_key: API 秘钥
|
|
300
|
+
:param conversation_id: 会话 ID
|
|
301
|
+
:param name: (选填)名称,若 auto_generate 为 true 时,该参数可不传。
|
|
302
|
+
:param auto_generate: (选填)自动生成标题,默认 false。
|
|
303
|
+
:param user_id: 调用人user_id
|
|
304
|
+
:param server_url: 模型服务地址
|
|
305
|
+
:return:
|
|
306
|
+
"""
|
|
307
|
+
if user_id is None:
|
|
308
|
+
user_id = uuid.uuid4().hex
|
|
309
|
+
data = {
|
|
310
|
+
"name": name,
|
|
311
|
+
"auto_generate": auto_generate,
|
|
312
|
+
"user": user_id
|
|
313
|
+
}
|
|
314
|
+
if server_url is None:
|
|
315
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
316
|
+
headers = {
|
|
317
|
+
'Authorization': f'Bearer {api_key}',
|
|
318
|
+
'Content-Type': 'application/json'
|
|
319
|
+
}
|
|
320
|
+
response = requests.post(f"{server_url}/v1/conversations/{conversation_id}/name", headers=headers, params=data)
|
|
321
|
+
return response.json()
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def dify_files_upload(api_key: str, file, user_id=None,
|
|
325
|
+
server_url: str = None):
|
|
326
|
+
"""
|
|
327
|
+
会话重命名
|
|
328
|
+
:param api_key: API 秘钥
|
|
329
|
+
:param conversation_id: 会话 ID
|
|
330
|
+
:param name: (选填)名称,若 auto_generate 为 true 时,该参数可不传。
|
|
331
|
+
:param auto_generate: (选填)自动生成标题,默认 false。
|
|
332
|
+
:param user_id: 调用人user_id
|
|
333
|
+
:param server_url: 模型服务地址
|
|
334
|
+
:return:
|
|
335
|
+
"""
|
|
336
|
+
if user_id is None:
|
|
337
|
+
user_id = uuid.uuid4().hex
|
|
338
|
+
data = {
|
|
339
|
+
"user": user_id
|
|
340
|
+
}
|
|
341
|
+
files = [
|
|
342
|
+
('file', (file.filename, file, file.content_type))
|
|
343
|
+
]
|
|
344
|
+
if server_url is None:
|
|
345
|
+
server_url = app_config.get("DIFY_SERVER_URL")
|
|
346
|
+
headers = {
|
|
347
|
+
'Authorization': f'Bearer {api_key}',
|
|
348
|
+
# 'Content-Type': 'multipart/form-data'
|
|
349
|
+
}
|
|
350
|
+
response = requests.post(f"{server_url}/v1/files/upload", headers=headers, data=data, files=files)
|
|
351
|
+
return response.json()
|
|
@@ -28,6 +28,7 @@ lesscode_flask/setting/__init__.py
|
|
|
28
28
|
lesscode_flask/setup/__init__.py
|
|
29
29
|
lesscode_flask/static/swagger.py
|
|
30
30
|
lesscode_flask/utils/__init__.py
|
|
31
|
+
lesscode_flask/utils/dify.py
|
|
31
32
|
lesscode_flask/utils/helpers.py
|
|
32
33
|
lesscode_flask/utils/decorator/__init__.py
|
|
33
34
|
lesscode_flask/utils/decorator/cache.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/export_data/data_download_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/resource_param_template.py
RENAMED
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/service/access_log_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/json/NotSortJSONProvider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/swagger/swagger_template.py
RENAMED
|
File without changes
|
{lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/swagger/swagger_util.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|