lesscode-flask 0.1.67__tar.gz → 0.1.68__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.
Files changed (59) hide show
  1. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/PKG-INFO +1 -1
  2. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/__init__.py +1 -1
  3. lesscode_flask-0.1.67/lesscode_flask/utils/dify.py → lesscode_flask-0.1.68/lesscode_flask/utils/dify_utils.py +161 -90
  4. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask.egg-info/PKG-INFO +1 -1
  5. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask.egg-info/SOURCES.txt +1 -1
  6. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/README.md +0 -0
  7. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/app.py +0 -0
  8. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/db/__init__.py +0 -0
  9. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/db/datasource.py +0 -0
  10. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/db/executor.py +0 -0
  11. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/export_data/__init__.py +0 -0
  12. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/export_data/data_download_handler.py +0 -0
  13. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/log/access_log_handler.py +0 -0
  14. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/model/access_log.py +0 -0
  15. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/model/base_model.py +0 -0
  16. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/model/parameterized_query.py +0 -0
  17. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/model/resource_param_template.py +0 -0
  18. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/model/response_result.py +0 -0
  19. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/model/user.py +0 -0
  20. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/service/access_log_service.py +0 -0
  21. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/service/base_service.py +0 -0
  22. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/service/resource_param_template_service.py +0 -0
  23. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/setting/__init__.py +0 -0
  24. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/setup/__init__.py +0 -0
  25. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/signals.py +0 -0
  26. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/static/swagger.py +0 -0
  27. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/__init__.py +0 -0
  28. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/decorator/__init__.py +0 -0
  29. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/decorator/cache.py +0 -0
  30. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/decorator/swagger.py +0 -0
  31. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/file/file_exporter.py +0 -0
  32. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/file/file_utils.py +0 -0
  33. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/helpers.py +0 -0
  34. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
  35. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/oss/__init__.py +0 -0
  36. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
  37. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/redis/redis_helper.py +0 -0
  38. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/request/request.py +0 -0
  39. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
  40. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
  41. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/task/__init__.py +0 -0
  42. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/task/task_helper.py +0 -0
  43. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/utils/thread/thread_utils.py +0 -0
  44. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask/wsgi.py +0 -0
  45. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask.egg-info/dependency_links.txt +0 -0
  46. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask.egg-info/requires.txt +0 -0
  47. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/lesscode_flask.egg-info/top_level.txt +0 -0
  48. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/query_runner/__init__.py +0 -0
  49. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/query_runner/clickhouse.py +0 -0
  50. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/query_runner/elasticsearch.py +0 -0
  51. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/query_runner/kingbase.py +0 -0
  52. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/query_runner/mysql.py +0 -0
  53. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/query_runner/pg.py +0 -0
  54. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/settings/__init__.py +0 -0
  55. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/settings/helpers.py +0 -0
  56. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/utils/__init__.py +0 -0
  57. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/redash/utils/requests_session.py +0 -0
  58. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/setup.cfg +0 -0
  59. {lesscode_flask-0.1.67 → lesscode_flask-0.1.68}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.1.67
3
+ Version: 0.1.68
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -1,4 +1,4 @@
1
- __version__ = '0.1.67'
1
+ __version__ = '0.1.68'
2
2
 
3
3
  import functools
4
4
  import logging
@@ -1,71 +1,10 @@
1
- import json
2
1
  import uuid
3
2
 
4
3
  import requests
5
- from flask import current_app
6
4
 
7
- from lesscode_flask.model.user import flask_login
8
5
  from lesscode_flask.utils.helpers import app_config
9
6
 
10
7
 
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
8
  def dify_chat_messages(api_key, query: str = None, inputs: dict = None, conversation_id: str = "", files=None,
70
9
  response_mode="streaming", user_id: str = None, server_url: str = None):
71
10
  """
@@ -91,41 +30,116 @@ def dify_chat_messages(api_key, query: str = None, inputs: dict = None, conversa
91
30
  "conversation_id": conversation_id,
92
31
  "user": user_id,
93
32
  "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
33
  }
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
34
  headers = {
115
35
  'Authorization': f'Bearer {api_key}',
116
36
  'Content-Type': 'application/json'
117
37
  }
118
38
  try:
119
39
  response = requests.post(f"{server_url}/v1/chat-messages", headers=headers, json=data, stream=True)
40
+ if "streaming" == response_mode:
41
+ for line in response.iter_lines(decode_unicode=True):
42
+ yield line
43
+ else: # blocking
44
+ res = response.text
45
+ yield res
46
+ except Exception as e:
47
+ if "streaming" == response_mode:
48
+ print(f"Error: {e}")
49
+ yield 'data: {"event": "message_end"}'
50
+ else: # blocking
51
+ return f'{{"event": "message", "answer": "{e}"}}'
52
+
53
+
54
+ def dify_completion_messages(api_key, query: str = None, inputs: dict = None, conversation_id: str = "", files=None,
55
+ response_mode="streaming", user_id: str = None, server_url: str = None):
56
+ """
57
+ 发送对话消息
58
+ :param api_key: API 秘钥
59
+ :param query: 用户查询语句
60
+ :param inputs: 调用参数
61
+ :param conversation_id: 会话 ID
62
+ :param files: 文件列表,适用于传入文件结合文本理解并回答问题
63
+ :param server_url:模型服务地址
64
+ :param response_mode: 响应类型 streaming:流式 ,blocking 阻塞式
65
+ :param user_id: 调用人user_id
66
+ :return:
67
+ """
68
+ if server_url is None:
69
+ server_url = app_config.get("DIFY_SERVER_URL")
70
+ if user_id is None:
71
+ user_id = uuid.uuid4().hex
72
+ if inputs is None:
73
+ inputs = {"query": query}
74
+ else:
75
+ inputs["query"] = query
76
+ data = {
77
+ "inputs": inputs,
78
+ "response_mode": response_mode,
79
+ "conversation_id": conversation_id,
80
+ "user": user_id,
81
+ "files": files
82
+ }
83
+ headers = {
84
+ 'Authorization': f'Bearer {api_key}',
85
+ 'Content-Type': 'application/json'
86
+ }
87
+ try:
88
+ response = requests.post(f"{server_url}/v1/completion-messages", headers=headers, json=data, stream=True)
89
+ if "streaming" == response_mode:
90
+ pass
91
+ for line in response.iter_lines(decode_unicode=True):
92
+ yield line
93
+ else: # blocking
94
+ res = response.text
95
+ yield res
96
+ except Exception as e:
97
+ if "streaming" == response_mode:
98
+ print(f"Error: {e}")
99
+ yield 'data: {"event": "message_end"}'
100
+ else: # blocking
101
+ return f'{{"event": "message", "answer": "{e}"}}'
102
+
103
+
104
+ def dify_workflows_run(api_key, query: str = None, inputs: dict = None, conversation_id: str = "", files=None,
105
+ response_mode="streaming", user_id: str = None, server_url: str = None):
106
+ """
107
+ 发送对话消息
108
+ :param api_key: API 秘钥
109
+ :param query: 用户查询语句
110
+ :param inputs: 调用参数
111
+ :param conversation_id: 会话 ID
112
+ :param files: 文件列表,适用于传入文件结合文本理解并回答问题
113
+ :param server_url:模型服务地址
114
+ :param response_mode: 响应类型 streaming:流式 ,blocking 阻塞式
115
+ :param user_id: 调用人user_id
116
+ :return:
117
+ """
118
+ if server_url is None:
119
+ server_url = app_config.get("DIFY_SERVER_URL")
120
+ if user_id is None:
121
+ user_id = uuid.uuid4().hex
122
+ if inputs is None:
123
+ inputs = {"query": query}
124
+ else:
125
+ inputs["query"] = query
126
+ data = {
127
+ "inputs": inputs,
128
+ "response_mode": response_mode,
129
+ "user": user_id,
130
+ "files": files
131
+ }
132
+ headers = {
133
+ 'Authorization': f'Bearer {api_key}',
134
+ 'Content-Type': 'application/json'
135
+ }
136
+ try:
137
+ response = requests.post(f"{server_url}/v1/workflows/run", headers=headers, json=data, stream=True)
120
138
  if "streaming" == response_mode:
121
139
  pass
122
140
  for line in response.iter_lines(decode_unicode=True):
123
141
  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"
142
+ yield line
129
143
  else: # blocking
130
144
  res = response.text
131
145
  yield res
@@ -137,6 +151,66 @@ def dify_chat_messages(api_key, query: str = None, inputs: dict = None, conversa
137
151
  return f'{{"event": "message", "answer": "{e}"}}'
138
152
 
139
153
 
154
+ def dify_stop_completion_messages(api_key: str, task_id: str, user_id=None, server_url: str = None):
155
+ """
156
+ 停止响应 仅支持流式模式。
157
+ :param api_key: API 秘钥
158
+ :param task_id: 任务 ID,可在流式返回 Chunk 中获取
159
+ :param user_id: 调用人user_id
160
+ :param server_url: 模型服务地址
161
+ :return:
162
+ """
163
+
164
+ if user_id is None:
165
+ user_id = uuid.uuid4().hex
166
+ data = {
167
+ "user": user_id
168
+ }
169
+ headers = {
170
+ 'Authorization': f'Bearer {api_key}',
171
+ 'Content-Type': 'application/json'
172
+ }
173
+ if server_url is None:
174
+ server_url = app_config.get("DIFY_SERVER_URL")
175
+ try:
176
+ requests.post(f"{server_url}/v1/completion-messages/{task_id}/stop", headers=headers, json=data, stream=False)
177
+ finally:
178
+ # 接口固定返回success
179
+ return {
180
+ "result": "success"
181
+ }
182
+
183
+
184
+ def dify_stop_workflows(api_key: str, task_id: str, user_id=None, server_url: str = None):
185
+ """
186
+ 停止响应 仅支持流式模式。
187
+ :param api_key: API 秘钥
188
+ :param task_id: 任务 ID,可在流式返回 Chunk 中获取
189
+ :param user_id: 调用人user_id
190
+ :param server_url: 模型服务地址
191
+ :return:
192
+ """
193
+
194
+ if user_id is None:
195
+ user_id = uuid.uuid4().hex
196
+ data = {
197
+ "user": user_id
198
+ }
199
+ headers = {
200
+ 'Authorization': f'Bearer {api_key}',
201
+ 'Content-Type': 'application/json'
202
+ }
203
+ if server_url is None:
204
+ server_url = app_config.get("DIFY_SERVER_URL")
205
+ try:
206
+ requests.post(f"{server_url}/v1/workflows/tasks/{task_id}/stop", headers=headers, json=data, stream=False)
207
+ finally:
208
+ # 接口固定返回success
209
+ return {
210
+ "result": "success"
211
+ }
212
+
213
+
140
214
  def dify_stop_messages(api_key: str, task_id: str, user_id=None, server_url: str = None):
141
215
  """
142
216
  停止响应 仅支持流式模式。
@@ -324,11 +398,9 @@ def dify_conversations_rename(api_key: str, conversation_id: str, name: str = No
324
398
  def dify_files_upload(api_key: str, file, user_id=None,
325
399
  server_url: str = None):
326
400
  """
327
- 会话重命名
401
+ 上传文件
328
402
  :param api_key: API 秘钥
329
- :param conversation_id: 会话 ID
330
- :param name: (选填)名称,若 auto_generate 为 true 时,该参数可不传。
331
- :param auto_generate: (选填)自动生成标题,默认 false。
403
+ :param file: 文件对象
332
404
  :param user_id: 调用人user_id
333
405
  :param server_url: 模型服务地址
334
406
  :return:
@@ -345,7 +417,6 @@ def dify_files_upload(api_key: str, file, user_id=None,
345
417
  server_url = app_config.get("DIFY_SERVER_URL")
346
418
  headers = {
347
419
  'Authorization': f'Bearer {api_key}',
348
- # 'Content-Type': 'multipart/form-data'
349
420
  }
350
421
  response = requests.post(f"{server_url}/v1/files/upload", headers=headers, data=data, files=files)
351
422
  return response.json()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.1.67
3
+ Version: 0.1.68
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -28,7 +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
+ lesscode_flask/utils/dify_utils.py
32
32
  lesscode_flask/utils/helpers.py
33
33
  lesscode_flask/utils/decorator/__init__.py
34
34
  lesscode_flask/utils/decorator/cache.py