dify-oapi2 0.1.0__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.
Files changed (255) hide show
  1. dify_oapi/__init__.py +0 -0
  2. dify_oapi/api/__init__.py +0 -0
  3. dify_oapi/api/chat/__init__.py +0 -0
  4. dify_oapi/api/chat/service.py +8 -0
  5. dify_oapi/api/chat/v1/__init__.py +0 -0
  6. dify_oapi/api/chat/v1/model/__init__.py +0 -0
  7. dify_oapi/api/chat/v1/model/audio_to_text_request.py +40 -0
  8. dify_oapi/api/chat/v1/model/audio_to_text_request_body.py +23 -0
  9. dify_oapi/api/chat/v1/model/audio_to_text_response.py +5 -0
  10. dify_oapi/api/chat/v1/model/chat_request.py +32 -0
  11. dify_oapi/api/chat/v1/model/chat_request_body.py +57 -0
  12. dify_oapi/api/chat/v1/model/chat_request_file.py +46 -0
  13. dify_oapi/api/chat/v1/model/chat_response.py +19 -0
  14. dify_oapi/api/chat/v1/model/delete_conversation_request.py +38 -0
  15. dify_oapi/api/chat/v1/model/delete_conversation_request_body.py +23 -0
  16. dify_oapi/api/chat/v1/model/delete_conversation_response.py +5 -0
  17. dify_oapi/api/chat/v1/model/get_conversation_list_request.py +48 -0
  18. dify_oapi/api/chat/v1/model/get_conversation_list_response.py +21 -0
  19. dify_oapi/api/chat/v1/model/message_history_request.py +48 -0
  20. dify_oapi/api/chat/v1/model/message_history_response.py +49 -0
  21. dify_oapi/api/chat/v1/model/message_suggested_request.py +36 -0
  22. dify_oapi/api/chat/v1/model/message_suggested_response.py +6 -0
  23. dify_oapi/api/chat/v1/model/rename_conversation_request.py +38 -0
  24. dify_oapi/api/chat/v1/model/rename_conversation_request_body.py +33 -0
  25. dify_oapi/api/chat/v1/model/rename_conversation_response.py +11 -0
  26. dify_oapi/api/chat/v1/model/stop_chat_request.py +38 -0
  27. dify_oapi/api/chat/v1/model/stop_chat_request_body.py +23 -0
  28. dify_oapi/api/chat/v1/model/stop_chat_response.py +5 -0
  29. dify_oapi/api/chat/v1/resource/__init__.py +4 -0
  30. dify_oapi/api/chat/v1/resource/audio.py +17 -0
  31. dify_oapi/api/chat/v1/resource/chat.py +68 -0
  32. dify_oapi/api/chat/v1/resource/conversation.py +59 -0
  33. dify_oapi/api/chat/v1/resource/message.py +35 -0
  34. dify_oapi/api/chat/v1/version.py +11 -0
  35. dify_oapi/api/completion/__init__.py +0 -0
  36. dify_oapi/api/completion/service.py +8 -0
  37. dify_oapi/api/completion/v1/__init__.py +0 -0
  38. dify_oapi/api/completion/v1/model/__init__.py +0 -0
  39. dify_oapi/api/completion/v1/model/completion_request.py +34 -0
  40. dify_oapi/api/completion/v1/model/completion_request_body.py +43 -0
  41. dify_oapi/api/completion/v1/model/completion_request_body_input.py +38 -0
  42. dify_oapi/api/completion/v1/model/completion_request_file.py +49 -0
  43. dify_oapi/api/completion/v1/model/completion_response.py +18 -0
  44. dify_oapi/api/completion/v1/model/stop_completion_request.py +38 -0
  45. dify_oapi/api/completion/v1/model/stop_completion_request_body.py +23 -0
  46. dify_oapi/api/completion/v1/model/stop_completion_response.py +5 -0
  47. dify_oapi/api/completion/v1/resource/__init__.py +1 -0
  48. dify_oapi/api/completion/v1/resource/completion.py +84 -0
  49. dify_oapi/api/completion/v1/version.py +8 -0
  50. dify_oapi/api/dify/__init__.py +0 -0
  51. dify_oapi/api/dify/service.py +8 -0
  52. dify_oapi/api/dify/v1/__init__.py +0 -0
  53. dify_oapi/api/dify/v1/model/__init__.py +0 -0
  54. dify_oapi/api/dify/v1/model/get_info_request.py +30 -0
  55. dify_oapi/api/dify/v1/model/get_info_response.py +7 -0
  56. dify_oapi/api/dify/v1/model/get_meta_request.py +30 -0
  57. dify_oapi/api/dify/v1/model/get_meta_response.py +19 -0
  58. dify_oapi/api/dify/v1/model/get_parameter_request.py +30 -0
  59. dify_oapi/api/dify/v1/model/get_parameter_response.py +13 -0
  60. dify_oapi/api/dify/v1/model/message_feedback_request.py +38 -0
  61. dify_oapi/api/dify/v1/model/message_feedback_request_body.py +30 -0
  62. dify_oapi/api/dify/v1/model/message_feedback_response.py +5 -0
  63. dify_oapi/api/dify/v1/model/text_to_audio_request.py +32 -0
  64. dify_oapi/api/dify/v1/model/text_to_audio_request_body.py +33 -0
  65. dify_oapi/api/dify/v1/model/text_to_audio_response.py +4 -0
  66. dify_oapi/api/dify/v1/model/upload_file_body.py +23 -0
  67. dify_oapi/api/dify/v1/model/upload_file_request.py +42 -0
  68. dify_oapi/api/dify/v1/model/upload_file_response.py +11 -0
  69. dify_oapi/api/dify/v1/resource/__init__.py +6 -0
  70. dify_oapi/api/dify/v1/resource/audio.py +17 -0
  71. dify_oapi/api/dify/v1/resource/file.py +17 -0
  72. dify_oapi/api/dify/v1/resource/info.py +19 -0
  73. dify_oapi/api/dify/v1/resource/message.py +21 -0
  74. dify_oapi/api/dify/v1/resource/meta.py +17 -0
  75. dify_oapi/api/dify/v1/resource/parameter.py +19 -0
  76. dify_oapi/api/dify/v1/version.py +13 -0
  77. dify_oapi/api/knowledge_base/__init__.py +0 -0
  78. dify_oapi/api/knowledge_base/service.py +8 -0
  79. dify_oapi/api/knowledge_base/v1/__init__.py +0 -0
  80. dify_oapi/api/knowledge_base/v1/model/__init__.py +0 -0
  81. dify_oapi/api/knowledge_base/v1/model/dataset/__init__.py +49 -0
  82. dify_oapi/api/knowledge_base/v1/model/dataset/create_request.py +32 -0
  83. dify_oapi/api/knowledge_base/v1/model/dataset/create_request_body.py +73 -0
  84. dify_oapi/api/knowledge_base/v1/model/dataset/create_response.py +11 -0
  85. dify_oapi/api/knowledge_base/v1/model/dataset/dataset_info.py +150 -0
  86. dify_oapi/api/knowledge_base/v1/model/dataset/delete_request.py +30 -0
  87. dify_oapi/api/knowledge_base/v1/model/dataset/delete_response.py +9 -0
  88. dify_oapi/api/knowledge_base/v1/model/dataset/external_knowledge_info.py +38 -0
  89. dify_oapi/api/knowledge_base/v1/model/dataset/filter_condition.py +72 -0
  90. dify_oapi/api/knowledge_base/v1/model/dataset/get_request.py +30 -0
  91. dify_oapi/api/knowledge_base/v1/model/dataset/get_response.py +11 -0
  92. dify_oapi/api/knowledge_base/v1/model/dataset/list_request.py +45 -0
  93. dify_oapi/api/knowledge_base/v1/model/dataset/list_response.py +13 -0
  94. dify_oapi/api/knowledge_base/v1/model/dataset/metadata_filtering_conditions.py +30 -0
  95. dify_oapi/api/knowledge_base/v1/model/dataset/reranking_model.py +28 -0
  96. dify_oapi/api/knowledge_base/v1/model/dataset/retrieval_model.py +147 -0
  97. dify_oapi/api/knowledge_base/v1/model/dataset/retrieve_request.py +38 -0
  98. dify_oapi/api/knowledge_base/v1/model/dataset/retrieve_request_body.py +38 -0
  99. dify_oapi/api/knowledge_base/v1/model/dataset/retrieve_response.py +53 -0
  100. dify_oapi/api/knowledge_base/v1/model/dataset/update_request.py +38 -0
  101. dify_oapi/api/knowledge_base/v1/model/dataset/update_request_body.py +58 -0
  102. dify_oapi/api/knowledge_base/v1/model/dataset/update_response.py +11 -0
  103. dify_oapi/api/knowledge_base/v1/model/document/__init__.py +0 -0
  104. dify_oapi/api/knowledge_base/v1/model/document/create_by_file_request.py +53 -0
  105. dify_oapi/api/knowledge_base/v1/model/document/create_by_file_request_body.py +31 -0
  106. dify_oapi/api/knowledge_base/v1/model/document/create_by_file_request_body_data.py +78 -0
  107. dify_oapi/api/knowledge_base/v1/model/document/create_by_file_response.py +12 -0
  108. dify_oapi/api/knowledge_base/v1/model/document/create_by_text_request.py +38 -0
  109. dify_oapi/api/knowledge_base/v1/model/document/create_by_text_request_body.py +80 -0
  110. dify_oapi/api/knowledge_base/v1/model/document/create_by_text_response.py +12 -0
  111. dify_oapi/api/knowledge_base/v1/model/document/data_source_info.py +30 -0
  112. dify_oapi/api/knowledge_base/v1/model/document/delete_request.py +38 -0
  113. dify_oapi/api/knowledge_base/v1/model/document/delete_response.py +9 -0
  114. dify_oapi/api/knowledge_base/v1/model/document/document_info.py +164 -0
  115. dify_oapi/api/knowledge_base/v1/model/document/get_request.py +40 -0
  116. dify_oapi/api/knowledge_base/v1/model/document/get_response.py +9 -0
  117. dify_oapi/api/knowledge_base/v1/model/document/get_upload_file_request.py +38 -0
  118. dify_oapi/api/knowledge_base/v1/model/document/get_upload_file_response.py +11 -0
  119. dify_oapi/api/knowledge_base/v1/model/document/indexing_status_info.py +80 -0
  120. dify_oapi/api/knowledge_base/v1/model/document/indexing_status_request.py +36 -0
  121. dify_oapi/api/knowledge_base/v1/model/document/indexing_status_response.py +11 -0
  122. dify_oapi/api/knowledge_base/v1/model/document/list_request.py +42 -0
  123. dify_oapi/api/knowledge_base/v1/model/document/list_response.py +15 -0
  124. dify_oapi/api/knowledge_base/v1/model/document/pre_processing_rule.py +32 -0
  125. dify_oapi/api/knowledge_base/v1/model/document/process_rule.py +34 -0
  126. dify_oapi/api/knowledge_base/v1/model/document/retrieval_model.py +54 -0
  127. dify_oapi/api/knowledge_base/v1/model/document/rules.py +31 -0
  128. dify_oapi/api/knowledge_base/v1/model/document/segmentation.py +35 -0
  129. dify_oapi/api/knowledge_base/v1/model/document/subchunk_segmentation.py +35 -0
  130. dify_oapi/api/knowledge_base/v1/model/document/update_by_file_request.py +53 -0
  131. dify_oapi/api/knowledge_base/v1/model/document/update_by_file_request_body.py +26 -0
  132. dify_oapi/api/knowledge_base/v1/model/document/update_by_file_request_body_data.py +40 -0
  133. dify_oapi/api/knowledge_base/v1/model/document/update_by_file_response.py +12 -0
  134. dify_oapi/api/knowledge_base/v1/model/document/update_by_text_request.py +55 -0
  135. dify_oapi/api/knowledge_base/v1/model/document/update_by_text_request_body.py +46 -0
  136. dify_oapi/api/knowledge_base/v1/model/document/update_by_text_response.py +14 -0
  137. dify_oapi/api/knowledge_base/v1/model/document/update_status_request.py +55 -0
  138. dify_oapi/api/knowledge_base/v1/model/document/update_status_request_body.py +32 -0
  139. dify_oapi/api/knowledge_base/v1/model/document/update_status_response.py +9 -0
  140. dify_oapi/api/knowledge_base/v1/model/document/upload_file_info.py +65 -0
  141. dify_oapi/api/knowledge_base/v1/model/metadata/__init__.py +35 -0
  142. dify_oapi/api/knowledge_base/v1/model/metadata/create_request.py +38 -0
  143. dify_oapi/api/knowledge_base/v1/model/metadata/create_request_body.py +31 -0
  144. dify_oapi/api/knowledge_base/v1/model/metadata/create_response.py +13 -0
  145. dify_oapi/api/knowledge_base/v1/model/metadata/delete_request.py +36 -0
  146. dify_oapi/api/knowledge_base/v1/model/metadata/delete_response.py +7 -0
  147. dify_oapi/api/knowledge_base/v1/model/metadata/list_request.py +30 -0
  148. dify_oapi/api/knowledge_base/v1/model/metadata/list_response.py +9 -0
  149. dify_oapi/api/knowledge_base/v1/model/metadata/metadata_info.py +38 -0
  150. dify_oapi/api/knowledge_base/v1/model/metadata/toggle_builtin_request.py +36 -0
  151. dify_oapi/api/knowledge_base/v1/model/metadata/toggle_builtin_response.py +7 -0
  152. dify_oapi/api/knowledge_base/v1/model/metadata/update_document_request.py +38 -0
  153. dify_oapi/api/knowledge_base/v1/model/metadata/update_document_request_body.py +79 -0
  154. dify_oapi/api/knowledge_base/v1/model/metadata/update_document_response.py +7 -0
  155. dify_oapi/api/knowledge_base/v1/model/metadata/update_request.py +44 -0
  156. dify_oapi/api/knowledge_base/v1/model/metadata/update_request_body.py +24 -0
  157. dify_oapi/api/knowledge_base/v1/model/metadata/update_response.py +13 -0
  158. dify_oapi/api/knowledge_base/v1/model/segment/__init__.py +77 -0
  159. dify_oapi/api/knowledge_base/v1/model/segment/child_chunk_info.py +88 -0
  160. dify_oapi/api/knowledge_base/v1/model/segment/create_child_chunk_request.py +52 -0
  161. dify_oapi/api/knowledge_base/v1/model/segment/create_child_chunk_request_body.py +23 -0
  162. dify_oapi/api/knowledge_base/v1/model/segment/create_child_chunk_response.py +7 -0
  163. dify_oapi/api/knowledge_base/v1/model/segment/create_request.py +42 -0
  164. dify_oapi/api/knowledge_base/v1/model/segment/create_request_body.py +25 -0
  165. dify_oapi/api/knowledge_base/v1/model/segment/create_response.py +8 -0
  166. dify_oapi/api/knowledge_base/v1/model/segment/delete_child_chunk_request.py +50 -0
  167. dify_oapi/api/knowledge_base/v1/model/segment/delete_child_chunk_response.py +5 -0
  168. dify_oapi/api/knowledge_base/v1/model/segment/delete_request.py +40 -0
  169. dify_oapi/api/knowledge_base/v1/model/segment/delete_response.py +5 -0
  170. dify_oapi/api/knowledge_base/v1/model/segment/get_request.py +40 -0
  171. dify_oapi/api/knowledge_base/v1/model/segment/get_response.py +8 -0
  172. dify_oapi/api/knowledge_base/v1/model/segment/list_child_chunks_request.py +56 -0
  173. dify_oapi/api/knowledge_base/v1/model/segment/list_child_chunks_response.py +11 -0
  174. dify_oapi/api/knowledge_base/v1/model/segment/list_request.py +50 -0
  175. dify_oapi/api/knowledge_base/v1/model/segment/list_response.py +12 -0
  176. dify_oapi/api/knowledge_base/v1/model/segment/segment_data.py +43 -0
  177. dify_oapi/api/knowledge_base/v1/model/segment/segment_info.py +123 -0
  178. dify_oapi/api/knowledge_base/v1/model/segment/update_child_chunk_request.py +58 -0
  179. dify_oapi/api/knowledge_base/v1/model/segment/update_child_chunk_request_body.py +23 -0
  180. dify_oapi/api/knowledge_base/v1/model/segment/update_child_chunk_response.py +7 -0
  181. dify_oapi/api/knowledge_base/v1/model/segment/update_request.py +48 -0
  182. dify_oapi/api/knowledge_base/v1/model/segment/update_request_body.py +25 -0
  183. dify_oapi/api/knowledge_base/v1/model/segment/update_response.py +8 -0
  184. dify_oapi/api/knowledge_base/v1/model/tag/__init__.py +41 -0
  185. dify_oapi/api/knowledge_base/v1/model/tag/bind_request.py +32 -0
  186. dify_oapi/api/knowledge_base/v1/model/tag/bind_request_body.py +29 -0
  187. dify_oapi/api/knowledge_base/v1/model/tag/bind_response.py +7 -0
  188. dify_oapi/api/knowledge_base/v1/model/tag/create_request.py +32 -0
  189. dify_oapi/api/knowledge_base/v1/model/tag/create_request_body.py +24 -0
  190. dify_oapi/api/knowledge_base/v1/model/tag/create_response.py +16 -0
  191. dify_oapi/api/knowledge_base/v1/model/tag/delete_request.py +32 -0
  192. dify_oapi/api/knowledge_base/v1/model/tag/delete_request_body.py +24 -0
  193. dify_oapi/api/knowledge_base/v1/model/tag/delete_response.py +7 -0
  194. dify_oapi/api/knowledge_base/v1/model/tag/list_request.py +24 -0
  195. dify_oapi/api/knowledge_base/v1/model/tag/list_response.py +19 -0
  196. dify_oapi/api/knowledge_base/v1/model/tag/query_bound_request.py +30 -0
  197. dify_oapi/api/knowledge_base/v1/model/tag/query_bound_response.py +9 -0
  198. dify_oapi/api/knowledge_base/v1/model/tag/tag_info.py +38 -0
  199. dify_oapi/api/knowledge_base/v1/model/tag/unbind_request.py +32 -0
  200. dify_oapi/api/knowledge_base/v1/model/tag/unbind_request_body.py +29 -0
  201. dify_oapi/api/knowledge_base/v1/model/tag/unbind_response.py +7 -0
  202. dify_oapi/api/knowledge_base/v1/model/tag/update_request.py +32 -0
  203. dify_oapi/api/knowledge_base/v1/model/tag/update_request_body.py +29 -0
  204. dify_oapi/api/knowledge_base/v1/model/tag/update_response.py +19 -0
  205. dify_oapi/api/knowledge_base/v1/resource/__init__.py +7 -0
  206. dify_oapi/api/knowledge_base/v1/resource/dataset.py +58 -0
  207. dify_oapi/api/knowledge_base/v1/resource/document.py +107 -0
  208. dify_oapi/api/knowledge_base/v1/resource/metadata.py +65 -0
  209. dify_oapi/api/knowledge_base/v1/resource/segment.py +110 -0
  210. dify_oapi/api/knowledge_base/v1/resource/tag.py +65 -0
  211. dify_oapi/api/knowledge_base/v1/version.py +12 -0
  212. dify_oapi/api/workflow/__init__.py +0 -0
  213. dify_oapi/api/workflow/service.py +8 -0
  214. dify_oapi/api/workflow/v1/__init__.py +0 -0
  215. dify_oapi/api/workflow/v1/model/__init__.py +0 -0
  216. dify_oapi/api/workflow/v1/model/get_workflow_log_request.py +50 -0
  217. dify_oapi/api/workflow/v1/model/get_workflow_log_response.py +42 -0
  218. dify_oapi/api/workflow/v1/model/get_workflow_result_request.py +30 -0
  219. dify_oapi/api/workflow/v1/model/get_workflow_result_response.py +17 -0
  220. dify_oapi/api/workflow/v1/model/run_workflow_request.py +32 -0
  221. dify_oapi/api/workflow/v1/model/run_workflow_request_body.py +42 -0
  222. dify_oapi/api/workflow/v1/model/run_workflow_request_file.py +50 -0
  223. dify_oapi/api/workflow/v1/model/run_workflow_response.py +24 -0
  224. dify_oapi/api/workflow/v1/model/stop_workflow_request.py +38 -0
  225. dify_oapi/api/workflow/v1/model/stop_workflow_request_body.py +23 -0
  226. dify_oapi/api/workflow/v1/model/stop_workflow_response.py +5 -0
  227. dify_oapi/api/workflow/v1/resource/__init__.py +1 -0
  228. dify_oapi/api/workflow/v1/resource/workflow.py +102 -0
  229. dify_oapi/api/workflow/v1/version.py +8 -0
  230. dify_oapi/client.py +97 -0
  231. dify_oapi/core/__init__.py +0 -0
  232. dify_oapi/core/const.py +15 -0
  233. dify_oapi/core/enum.py +21 -0
  234. dify_oapi/core/http/__init__.py +0 -0
  235. dify_oapi/core/http/transport/__init__.py +4 -0
  236. dify_oapi/core/http/transport/_misc.py +145 -0
  237. dify_oapi/core/http/transport/async_transport.py +217 -0
  238. dify_oapi/core/http/transport/sync_transport.py +220 -0
  239. dify_oapi/core/json.py +61 -0
  240. dify_oapi/core/log.py +8 -0
  241. dify_oapi/core/misc.py +41 -0
  242. dify_oapi/core/model/__init__.py +0 -0
  243. dify_oapi/core/model/base_request.py +21 -0
  244. dify_oapi/core/model/base_response.py +27 -0
  245. dify_oapi/core/model/config.py +9 -0
  246. dify_oapi/core/model/raw_request.py +5 -0
  247. dify_oapi/core/model/raw_response.py +17 -0
  248. dify_oapi/core/model/request_option.py +27 -0
  249. dify_oapi/core/type.py +5 -0
  250. dify_oapi/core/utils/__init__.py +0 -0
  251. dify_oapi/core/utils/strings.py +8 -0
  252. dify_oapi2-0.1.0.dist-info/LICENSE +21 -0
  253. dify_oapi2-0.1.0.dist-info/METADATA +295 -0
  254. dify_oapi2-0.1.0.dist-info/RECORD +255 -0
  255. dify_oapi2-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,102 @@
1
+ from collections.abc import AsyncGenerator, Generator
2
+ from typing import Literal, overload
3
+
4
+ from dify_oapi.core.http.transport import ATransport, Transport
5
+ from dify_oapi.core.model.config import Config
6
+ from dify_oapi.core.model.request_option import RequestOption
7
+
8
+ from ..model.get_workflow_log_request import GetWorkflowLogRequest
9
+ from ..model.get_workflow_log_response import GetWorkflowLogResponse
10
+ from ..model.get_workflow_result_request import GetWorkflowResultRequest
11
+ from ..model.get_workflow_result_response import GetWorkflowResultResponse
12
+ from ..model.run_workflow_request import RunWorkflowRequest
13
+ from ..model.run_workflow_response import RunWorkflowResponse
14
+ from ..model.stop_workflow_request import StopWorkflowRequest
15
+ from ..model.stop_workflow_response import StopWorkflowResponse
16
+
17
+
18
+ class Workflow:
19
+ def __init__(self, config: Config) -> None:
20
+ self.config: Config = config
21
+
22
+ @overload
23
+ def run(
24
+ self,
25
+ request: RunWorkflowRequest,
26
+ option: RequestOption | None,
27
+ stream: Literal[True],
28
+ ) -> Generator[bytes, None, None]: ...
29
+
30
+ @overload
31
+ def run(
32
+ self,
33
+ request: RunWorkflowRequest,
34
+ option: RequestOption | None,
35
+ stream: Literal[False],
36
+ ) -> RunWorkflowResponse: ...
37
+
38
+ @overload
39
+ def run(self, request: RunWorkflowRequest, option: RequestOption | None) -> RunWorkflowResponse: ...
40
+
41
+ def run(
42
+ self,
43
+ request: RunWorkflowRequest,
44
+ option: RequestOption | None = None,
45
+ stream: bool = False,
46
+ ):
47
+ if stream:
48
+ return Transport.execute(self.config, request, option=option, stream=True)
49
+ else:
50
+ return Transport.execute(self.config, request, unmarshal_as=RunWorkflowResponse, option=option)
51
+
52
+ @overload
53
+ async def arun(
54
+ self,
55
+ request: RunWorkflowRequest,
56
+ option: RequestOption | None,
57
+ stream: Literal[True],
58
+ ) -> AsyncGenerator[bytes, None]: ...
59
+
60
+ @overload
61
+ async def arun(
62
+ self,
63
+ request: RunWorkflowRequest,
64
+ option: RequestOption | None,
65
+ stream: Literal[False],
66
+ ) -> RunWorkflowResponse: ...
67
+
68
+ @overload
69
+ async def arun(self, request: RunWorkflowRequest, option: RequestOption | None) -> RunWorkflowResponse: ...
70
+
71
+ async def arun(
72
+ self,
73
+ request: RunWorkflowRequest,
74
+ option: RequestOption | None = None,
75
+ stream: bool = False,
76
+ ):
77
+ if stream:
78
+ return await ATransport.aexecute(self.config, request, option=option, stream=True)
79
+ else:
80
+ return await ATransport.aexecute(self.config, request, unmarshal_as=RunWorkflowResponse, option=option)
81
+
82
+ def stop(self, request: StopWorkflowRequest, option: RequestOption | None = None) -> StopWorkflowResponse:
83
+ return Transport.execute(self.config, request, unmarshal_as=StopWorkflowResponse, option=option)
84
+
85
+ async def astop(self, request: StopWorkflowRequest, option: RequestOption | None = None) -> StopWorkflowResponse:
86
+ return await ATransport.aexecute(self.config, request, unmarshal_as=StopWorkflowResponse, option=option)
87
+
88
+ def result(
89
+ self, request: GetWorkflowResultRequest, option: RequestOption | None = None
90
+ ) -> GetWorkflowResultResponse:
91
+ return Transport.execute(self.config, request, unmarshal_as=GetWorkflowResultResponse, option=option)
92
+
93
+ async def aresult(
94
+ self, request: GetWorkflowResultRequest, option: RequestOption | None = None
95
+ ) -> GetWorkflowResultResponse:
96
+ return await ATransport.aexecute(self.config, request, unmarshal_as=GetWorkflowResultResponse, option=option)
97
+
98
+ def log(self, request: GetWorkflowLogRequest, option: RequestOption | None = None) -> GetWorkflowLogResponse:
99
+ return Transport.execute(self.config, request, unmarshal_as=GetWorkflowLogResponse, option=option)
100
+
101
+ async def alog(self, request: GetWorkflowLogRequest, option: RequestOption | None = None) -> GetWorkflowLogResponse:
102
+ return await ATransport.aexecute(self.config, request, unmarshal_as=GetWorkflowLogResponse, option=option)
@@ -0,0 +1,8 @@
1
+ from dify_oapi.core.model.config import Config
2
+
3
+ from .resource import Workflow
4
+
5
+
6
+ class V1:
7
+ def __init__(self, config: Config):
8
+ self.workflow: Workflow = Workflow(config)
dify_oapi/client.py ADDED
@@ -0,0 +1,97 @@
1
+ from __future__ import annotations
2
+
3
+ from .api.chat.service import ChatService
4
+ from .api.completion.service import CompletionService
5
+ from .api.dify.service import DifyService
6
+ from .api.knowledge_base.service import KnowledgeBaseService
7
+ from .api.workflow.service import WorkflowService
8
+ from .core.enum import LogLevel
9
+ from .core.http.transport import Transport
10
+ from .core.log import logger
11
+ from .core.model.base_request import BaseRequest
12
+ from .core.model.config import Config
13
+
14
+
15
+ class Client:
16
+ def __init__(self):
17
+ self._config: Config | None = None
18
+ self._chat: ChatService | None = None
19
+ self._completion: CompletionService | None = None
20
+ self._dify: DifyService | None = None
21
+ self._workflow: WorkflowService | None = None
22
+ self._knowledge_base: KnowledgeBaseService | None = None
23
+
24
+ @property
25
+ def chat(self) -> ChatService:
26
+ if self._chat is None:
27
+ raise RuntimeError("Chat service has not been initialized")
28
+ return self._chat
29
+
30
+ @property
31
+ def completion(self) -> CompletionService:
32
+ if self._completion is None:
33
+ raise RuntimeError("Completion service has not been initialized")
34
+ return self._completion
35
+
36
+ @property
37
+ def dify(self) -> DifyService:
38
+ if self._dify is None:
39
+ raise RuntimeError("Dify service has not been initialized")
40
+ return self._dify
41
+
42
+ @property
43
+ def workflow(self) -> WorkflowService:
44
+ if self._workflow is None:
45
+ raise RuntimeError("Workflow service has not been initialized")
46
+ return self._workflow
47
+
48
+ @property
49
+ def knowledge_base(self) -> KnowledgeBaseService:
50
+ if self._knowledge_base is None:
51
+ raise RuntimeError("Knowledge base service has not been initialized")
52
+ return self._knowledge_base
53
+
54
+ def request(self, request: BaseRequest):
55
+ if self._config is None:
56
+ raise RuntimeError("Config is not set")
57
+ resp = Transport.execute(self._config, request)
58
+ return resp
59
+
60
+ @staticmethod
61
+ def builder() -> ClientBuilder:
62
+ return ClientBuilder()
63
+
64
+
65
+ class ClientBuilder:
66
+ def __init__(self) -> None:
67
+ self._config = Config()
68
+
69
+ def domain(self, domain: str) -> ClientBuilder:
70
+ self._config.domain = domain
71
+ return self
72
+
73
+ def log_level(self, level: LogLevel) -> ClientBuilder:
74
+ self._config.log_level = level
75
+ return self
76
+
77
+ def max_retry_count(self, count: int) -> ClientBuilder:
78
+ self._config.max_retry_count = count
79
+ return self
80
+
81
+ def build(self) -> Client:
82
+ client: Client = Client()
83
+ client._config = self._config
84
+
85
+ # Initialize logger
86
+ self._init_logger()
87
+
88
+ # Initialize services
89
+ client._chat = ChatService(self._config)
90
+ client._completion = CompletionService(self._config)
91
+ client._dify = DifyService(self._config)
92
+ client._workflow = WorkflowService(self._config)
93
+ client._knowledge_base = KnowledgeBaseService(self._config)
94
+ return client
95
+
96
+ def _init_logger(self):
97
+ logger.setLevel(int(self._config.log_level.value))
File without changes
@@ -0,0 +1,15 @@
1
+ # # Info
2
+ # VERSION = "1.2.6"
3
+
4
+ # Header
5
+ USER_AGENT = "User-Agent"
6
+ AUTHORIZATION = "Authorization"
7
+ CONTENT_TYPE = "Content-Type"
8
+
9
+ # Content-Type
10
+ APPLICATION_JSON = "application/json"
11
+
12
+ UTF_8 = "UTF-8"
13
+
14
+
15
+ SLEEP_BASE_TIME = 0.1
dify_oapi/core/enum.py ADDED
@@ -0,0 +1,21 @@
1
+ from enum import Enum, auto
2
+
3
+
4
+ class HttpMethod(Enum):
5
+ GET = auto()
6
+ HEAD = auto()
7
+ POST = auto()
8
+ PUT = auto()
9
+ PATCH = auto()
10
+ DELETE = auto()
11
+ CONNECT = auto()
12
+ OPTIONS = auto()
13
+ TRACE = auto()
14
+
15
+
16
+ class LogLevel(Enum):
17
+ DEBUG = 10
18
+ INFO = 20
19
+ WARNING = 30
20
+ ERROR = 40
21
+ CRITICAL = 50
File without changes
@@ -0,0 +1,4 @@
1
+ from .async_transport import ATransport
2
+ from .sync_transport import Transport
3
+
4
+ __all__ = ["Transport", "ATransport"]
@@ -0,0 +1,145 @@
1
+ from dify_oapi.core.const import APPLICATION_JSON, AUTHORIZATION, SLEEP_BASE_TIME, UTF_8
2
+ from dify_oapi.core.json import JSON
3
+ from dify_oapi.core.log import logger
4
+ from dify_oapi.core.misc import HiddenText
5
+ from dify_oapi.core.model.base_request import BaseRequest
6
+ from dify_oapi.core.model.raw_response import RawResponse
7
+ from dify_oapi.core.model.request_option import RequestOption
8
+ from dify_oapi.core.type import T
9
+
10
+
11
+ def _build_url(domain: str | None, uri: str | None, paths: dict[str, str] | None) -> str:
12
+ if not domain:
13
+ raise RuntimeError("domain is required")
14
+ if not uri:
15
+ raise RuntimeError("uri is required")
16
+
17
+ # Replace path parameters
18
+ for key, value in (paths or {}).items():
19
+ uri = uri.replace(f":{key}", value)
20
+
21
+ # Normalize URL joining
22
+ return f"{domain.rstrip('/')}{uri}" if not uri.startswith("/") else f"{domain.rstrip('/')}{uri}"
23
+
24
+
25
+ def _build_header(request: BaseRequest, option: RequestOption) -> dict[str, str]:
26
+ headers = request.headers.copy()
27
+
28
+ # Merge option headers
29
+ if option.headers:
30
+ headers.update(option.headers)
31
+
32
+ # Add authorization header
33
+ if option.api_key:
34
+ hidden_text = HiddenText(f"Bearer {option.api_key}", redacted="****")
35
+ headers[AUTHORIZATION] = hidden_text.secret
36
+
37
+ return headers
38
+
39
+
40
+ def _merge_dicts(*dicts: dict | None) -> dict:
41
+ """Merge multiple dictionaries, ignoring None values."""
42
+ result: dict = {}
43
+ for d in filter(None, dicts):
44
+ result.update(d)
45
+ return result
46
+
47
+
48
+ def _create_no_content_response(unmarshal_as: type[T]) -> T:
49
+ """Create response for 204 No Content status."""
50
+ try:
51
+ if hasattr(unmarshal_as, "__annotations__") and "result" in unmarshal_as.__annotations__:
52
+ return unmarshal_as(result="success")
53
+ return unmarshal_as()
54
+ except Exception:
55
+ resp = unmarshal_as.__new__(unmarshal_as)
56
+ if hasattr(resp, "result"):
57
+ try:
58
+ object.__setattr__(resp, "result", "success")
59
+ except Exception:
60
+ pass
61
+ return resp
62
+
63
+
64
+ def _handle_json_response(content: str, unmarshal_as: type[T]) -> T:
65
+ """Handle JSON response content."""
66
+ import json
67
+
68
+ parsed_json = json.loads(content)
69
+
70
+ if isinstance(parsed_json, list):
71
+ return _handle_array_response(parsed_json, unmarshal_as)
72
+ elif isinstance(parsed_json, dict):
73
+ return JSON.unmarshal(content, unmarshal_as)
74
+ else:
75
+ return _handle_primitive_response(parsed_json, unmarshal_as)
76
+
77
+
78
+ def _handle_array_response(data: list, unmarshal_as: type[T]) -> T:
79
+ """Handle array JSON responses."""
80
+ if hasattr(unmarshal_as, "__annotations__") and "data" in unmarshal_as.__annotations__:
81
+ return unmarshal_as(data=data)
82
+ return unmarshal_as(data=data)
83
+
84
+
85
+ def _handle_primitive_response(value, unmarshal_as: type[T]) -> T:
86
+ """Handle primitive JSON responses."""
87
+ if not hasattr(unmarshal_as, "__annotations__"):
88
+ return unmarshal_as()
89
+
90
+ annotations = unmarshal_as.__annotations__
91
+ if "result" in annotations:
92
+ return unmarshal_as(result=str(value))
93
+ elif "data" in annotations:
94
+ return unmarshal_as(data=value)
95
+ else:
96
+ return unmarshal_as()
97
+
98
+
99
+ def _set_raw_response(resp: T, raw_resp: RawResponse) -> T:
100
+ """Set raw response on the response object."""
101
+ try:
102
+ object.__setattr__(resp, "raw", raw_resp)
103
+ except Exception:
104
+ try:
105
+ resp.raw = raw_resp
106
+ except Exception:
107
+ if hasattr(resp, "model_copy"):
108
+ resp = resp.model_copy(update={"raw": raw_resp})
109
+ return resp
110
+
111
+
112
+ def _unmarshaller(raw_resp: RawResponse, unmarshal_as: type[T]) -> T:
113
+ """Unmarshal raw response to typed response object."""
114
+ if not raw_resp.status_code:
115
+ raise RuntimeError("status_code is required")
116
+ if raw_resp.content is None:
117
+ raise RuntimeError("content is required")
118
+
119
+ # Handle 204 No Content
120
+ if raw_resp.status_code == 204:
121
+ resp = _create_no_content_response(unmarshal_as)
122
+ # Handle JSON content
123
+ elif raw_resp.content_type and raw_resp.content_type.startswith(APPLICATION_JSON):
124
+ content = str(raw_resp.content, UTF_8)
125
+ if content:
126
+ try:
127
+ resp = _handle_json_response(content, unmarshal_as)
128
+ except Exception as e:
129
+ logger.error(f"Failed to unmarshal to {unmarshal_as} from {content}")
130
+ raise e
131
+ else:
132
+ resp = unmarshal_as()
133
+ else:
134
+ # Fallback for non-JSON content
135
+ try:
136
+ resp = unmarshal_as()
137
+ except Exception:
138
+ resp = unmarshal_as.__new__(unmarshal_as)
139
+
140
+ return _set_raw_response(resp, raw_resp)
141
+
142
+
143
+ def _get_sleep_time(retry_count: int) -> float:
144
+ """Calculate exponential backoff sleep time for retries."""
145
+ return float(SLEEP_BASE_TIME * (2 ** (retry_count - 1)))
@@ -0,0 +1,217 @@
1
+ import asyncio
2
+ import json
3
+ from collections.abc import AsyncGenerator, Coroutine
4
+ from typing import Literal, overload
5
+
6
+ import httpx
7
+
8
+ from dify_oapi.core.enum import HttpMethod
9
+ from dify_oapi.core.json import JSON
10
+ from dify_oapi.core.log import logger
11
+ from dify_oapi.core.model.base_request import BaseRequest
12
+ from dify_oapi.core.model.base_response import BaseResponse
13
+ from dify_oapi.core.model.config import Config
14
+ from dify_oapi.core.model.raw_response import RawResponse
15
+ from dify_oapi.core.model.request_option import RequestOption
16
+ from dify_oapi.core.type import T
17
+
18
+ from ._misc import _build_header, _build_url, _get_sleep_time, _merge_dicts, _unmarshaller
19
+
20
+
21
+ def _format_log_details(
22
+ method: str, url: str, headers: dict, queries: list[tuple[str, str]] | dict, body_data: dict | None
23
+ ) -> str:
24
+ """Format log details"""
25
+ details = [f"{method} {url}"]
26
+ if headers:
27
+ details.append(f"headers: {JSON.marshal(headers)}")
28
+ if queries:
29
+ queries_dict = dict(queries) if isinstance(queries, list) else queries
30
+ details.append(f"params: {JSON.marshal(queries_dict)}")
31
+ if body_data:
32
+ details.append(f"body: {JSON.marshal(body_data)}")
33
+ return ", ".join(details)
34
+
35
+
36
+ async def _handle_async_stream_error(response: httpx.Response) -> bytes:
37
+ """Handle async streaming response errors"""
38
+ try:
39
+ error_detail = await response.aread()
40
+ error_message = error_detail.decode("utf-8", errors="ignore").strip()
41
+ except Exception:
42
+ error_message = f"Error response with status code {response.status_code}"
43
+ logger.warning(f"Streaming request failed: {response.status_code}, detail: {error_message}")
44
+ return f"data: [ERROR] {error_message}\n\n".encode()
45
+
46
+
47
+ async def _async_stream_generator(
48
+ conf: Config,
49
+ req: BaseRequest,
50
+ *,
51
+ url: str,
52
+ headers: dict[str, str],
53
+ json_: dict | None,
54
+ data: dict | None,
55
+ files: dict | None,
56
+ http_method: HttpMethod,
57
+ ):
58
+ method_name = http_method.name
59
+ body_data = _merge_dicts(json_, files, data)
60
+
61
+ for retry in range(conf.max_retry_count + 1):
62
+ if retry > 0:
63
+ sleep_time = _get_sleep_time(retry)
64
+ logger.info(f"in-request: sleep {sleep_time}s")
65
+ await asyncio.sleep(sleep_time)
66
+
67
+ try:
68
+ async with (
69
+ httpx.AsyncClient() as client,
70
+ client.stream(
71
+ method_name,
72
+ url,
73
+ headers=headers,
74
+ params=tuple(req.queries),
75
+ json=json_,
76
+ data=data,
77
+ files=files,
78
+ timeout=conf.timeout,
79
+ ) as response,
80
+ ):
81
+ logger.debug(
82
+ f"{_format_log_details(method_name, url, headers, req.queries, body_data)}, stream response"
83
+ )
84
+
85
+ if response.status_code != 200:
86
+ yield await _handle_async_stream_error(response)
87
+ return
88
+
89
+ try:
90
+ async for chunk in response.aiter_bytes():
91
+ yield chunk
92
+ except Exception as e:
93
+ logger.exception("Streaming failed during chunk reading")
94
+ yield f"data: [ERROR] Stream interrupted: {str(e)}\n\n".encode()
95
+ return
96
+
97
+ except httpx.RequestError as e:
98
+ err_msg = f"{e.__class__.__name__}: {e!r}"
99
+ log_details = _format_log_details(method_name, url, headers, req.queries, body_data)
100
+
101
+ if retry < conf.max_retry_count:
102
+ logger.info(f"in-request: retrying ({retry + 1}/{conf.max_retry_count}) {log_details}, exp: {err_msg}")
103
+ continue
104
+ logger.info(
105
+ f"in-request: request failed, retried ({retry}/{conf.max_retry_count}) {log_details}, exp: {err_msg}"
106
+ )
107
+ raise
108
+
109
+
110
+ class ATransport:
111
+ @staticmethod
112
+ @overload
113
+ def aexecute(
114
+ conf: Config,
115
+ req: BaseRequest,
116
+ *,
117
+ stream: Literal[True],
118
+ option: RequestOption | None,
119
+ ) -> Coroutine[None, None, AsyncGenerator[bytes, None]]: ...
120
+
121
+ @staticmethod
122
+ @overload
123
+ def aexecute(conf: Config, req: BaseRequest) -> Coroutine[None, None, BaseResponse]: ...
124
+
125
+ @staticmethod
126
+ @overload
127
+ def aexecute(
128
+ conf: Config, req: BaseRequest, *, option: RequestOption | None
129
+ ) -> Coroutine[None, None, BaseResponse]: ...
130
+
131
+ @staticmethod
132
+ @overload
133
+ def aexecute(
134
+ conf: Config,
135
+ req: BaseRequest,
136
+ *,
137
+ unmarshal_as: type[T],
138
+ option: RequestOption | None,
139
+ ) -> Coroutine[None, None, T]: ...
140
+
141
+ @staticmethod
142
+ async def aexecute(
143
+ conf: Config,
144
+ req: BaseRequest,
145
+ *,
146
+ stream: bool = False,
147
+ unmarshal_as: type[T] | type[BaseResponse] | None = None,
148
+ option: RequestOption | None = None,
149
+ ):
150
+ unmarshal_as = unmarshal_as or BaseResponse
151
+ option = option or RequestOption()
152
+
153
+ if req.http_method is None:
154
+ raise RuntimeError("HTTP method is required")
155
+
156
+ url = _build_url(conf.domain, req.uri, req.paths)
157
+ headers = _build_header(req, option)
158
+
159
+ # Prepare request body
160
+ json_, files, data = None, None, None
161
+ if req.files:
162
+ files = req.files
163
+ if req.body is not None:
164
+ data = json.loads(JSON.marshal(req.body))
165
+ elif req.body is not None:
166
+ json_ = json.loads(JSON.marshal(req.body))
167
+
168
+ if stream:
169
+ return _async_stream_generator(
170
+ conf, req, url=url, headers=headers, json_=json_, data=data, files=files, http_method=req.http_method
171
+ )
172
+
173
+ method_name = req.http_method.name
174
+ body_data = _merge_dicts(json_, files, data)
175
+
176
+ async with httpx.AsyncClient() as client:
177
+ for retry in range(conf.max_retry_count + 1):
178
+ if retry > 0:
179
+ sleep_time = _get_sleep_time(retry)
180
+ logger.info(f"in-request: sleep {sleep_time}s")
181
+ await asyncio.sleep(sleep_time)
182
+
183
+ try:
184
+ response = await client.request(
185
+ method_name,
186
+ url,
187
+ headers=headers,
188
+ params=tuple(req.queries),
189
+ json=json_,
190
+ data=data,
191
+ files=files,
192
+ timeout=conf.timeout,
193
+ )
194
+ break
195
+ except httpx.RequestError as e:
196
+ err_msg = f"{e.__class__.__name__}: {e!r}"
197
+ log_details = _format_log_details(method_name, url, headers, req.queries, body_data)
198
+
199
+ if retry < conf.max_retry_count:
200
+ logger.info(
201
+ f"in-request: retrying ({retry + 1}/{conf.max_retry_count}) {log_details}, exp: {err_msg}"
202
+ )
203
+ continue
204
+ logger.info(
205
+ f"in-request: request failed, retried ({retry}/{conf.max_retry_count}) {log_details}, exp: {err_msg}"
206
+ )
207
+ raise
208
+
209
+ logger.debug(
210
+ f"{_format_log_details(method_name, url, headers, req.queries, body_data)} {response.status_code}"
211
+ )
212
+
213
+ raw_resp = RawResponse()
214
+ raw_resp.status_code = response.status_code
215
+ raw_resp.headers = dict(response.headers)
216
+ raw_resp.content = response.content
217
+ return _unmarshaller(raw_resp, unmarshal_as)