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.
- dify_oapi/__init__.py +0 -0
- dify_oapi/api/__init__.py +0 -0
- dify_oapi/api/chat/__init__.py +0 -0
- dify_oapi/api/chat/service.py +8 -0
- dify_oapi/api/chat/v1/__init__.py +0 -0
- dify_oapi/api/chat/v1/model/__init__.py +0 -0
- dify_oapi/api/chat/v1/model/audio_to_text_request.py +40 -0
- dify_oapi/api/chat/v1/model/audio_to_text_request_body.py +23 -0
- dify_oapi/api/chat/v1/model/audio_to_text_response.py +5 -0
- dify_oapi/api/chat/v1/model/chat_request.py +32 -0
- dify_oapi/api/chat/v1/model/chat_request_body.py +57 -0
- dify_oapi/api/chat/v1/model/chat_request_file.py +46 -0
- dify_oapi/api/chat/v1/model/chat_response.py +19 -0
- dify_oapi/api/chat/v1/model/delete_conversation_request.py +38 -0
- dify_oapi/api/chat/v1/model/delete_conversation_request_body.py +23 -0
- dify_oapi/api/chat/v1/model/delete_conversation_response.py +5 -0
- dify_oapi/api/chat/v1/model/get_conversation_list_request.py +48 -0
- dify_oapi/api/chat/v1/model/get_conversation_list_response.py +21 -0
- dify_oapi/api/chat/v1/model/message_history_request.py +48 -0
- dify_oapi/api/chat/v1/model/message_history_response.py +49 -0
- dify_oapi/api/chat/v1/model/message_suggested_request.py +36 -0
- dify_oapi/api/chat/v1/model/message_suggested_response.py +6 -0
- dify_oapi/api/chat/v1/model/rename_conversation_request.py +38 -0
- dify_oapi/api/chat/v1/model/rename_conversation_request_body.py +33 -0
- dify_oapi/api/chat/v1/model/rename_conversation_response.py +11 -0
- dify_oapi/api/chat/v1/model/stop_chat_request.py +38 -0
- dify_oapi/api/chat/v1/model/stop_chat_request_body.py +23 -0
- dify_oapi/api/chat/v1/model/stop_chat_response.py +5 -0
- dify_oapi/api/chat/v1/resource/__init__.py +4 -0
- dify_oapi/api/chat/v1/resource/audio.py +17 -0
- dify_oapi/api/chat/v1/resource/chat.py +68 -0
- dify_oapi/api/chat/v1/resource/conversation.py +59 -0
- dify_oapi/api/chat/v1/resource/message.py +35 -0
- dify_oapi/api/chat/v1/version.py +11 -0
- dify_oapi/api/completion/__init__.py +0 -0
- dify_oapi/api/completion/service.py +8 -0
- dify_oapi/api/completion/v1/__init__.py +0 -0
- dify_oapi/api/completion/v1/model/__init__.py +0 -0
- dify_oapi/api/completion/v1/model/completion_request.py +34 -0
- dify_oapi/api/completion/v1/model/completion_request_body.py +43 -0
- dify_oapi/api/completion/v1/model/completion_request_body_input.py +38 -0
- dify_oapi/api/completion/v1/model/completion_request_file.py +49 -0
- dify_oapi/api/completion/v1/model/completion_response.py +18 -0
- dify_oapi/api/completion/v1/model/stop_completion_request.py +38 -0
- dify_oapi/api/completion/v1/model/stop_completion_request_body.py +23 -0
- dify_oapi/api/completion/v1/model/stop_completion_response.py +5 -0
- dify_oapi/api/completion/v1/resource/__init__.py +1 -0
- dify_oapi/api/completion/v1/resource/completion.py +84 -0
- dify_oapi/api/completion/v1/version.py +8 -0
- dify_oapi/api/dify/__init__.py +0 -0
- dify_oapi/api/dify/service.py +8 -0
- dify_oapi/api/dify/v1/__init__.py +0 -0
- dify_oapi/api/dify/v1/model/__init__.py +0 -0
- dify_oapi/api/dify/v1/model/get_info_request.py +30 -0
- dify_oapi/api/dify/v1/model/get_info_response.py +7 -0
- dify_oapi/api/dify/v1/model/get_meta_request.py +30 -0
- dify_oapi/api/dify/v1/model/get_meta_response.py +19 -0
- dify_oapi/api/dify/v1/model/get_parameter_request.py +30 -0
- dify_oapi/api/dify/v1/model/get_parameter_response.py +13 -0
- dify_oapi/api/dify/v1/model/message_feedback_request.py +38 -0
- dify_oapi/api/dify/v1/model/message_feedback_request_body.py +30 -0
- dify_oapi/api/dify/v1/model/message_feedback_response.py +5 -0
- dify_oapi/api/dify/v1/model/text_to_audio_request.py +32 -0
- dify_oapi/api/dify/v1/model/text_to_audio_request_body.py +33 -0
- dify_oapi/api/dify/v1/model/text_to_audio_response.py +4 -0
- dify_oapi/api/dify/v1/model/upload_file_body.py +23 -0
- dify_oapi/api/dify/v1/model/upload_file_request.py +42 -0
- dify_oapi/api/dify/v1/model/upload_file_response.py +11 -0
- dify_oapi/api/dify/v1/resource/__init__.py +6 -0
- dify_oapi/api/dify/v1/resource/audio.py +17 -0
- dify_oapi/api/dify/v1/resource/file.py +17 -0
- dify_oapi/api/dify/v1/resource/info.py +19 -0
- dify_oapi/api/dify/v1/resource/message.py +21 -0
- dify_oapi/api/dify/v1/resource/meta.py +17 -0
- dify_oapi/api/dify/v1/resource/parameter.py +19 -0
- dify_oapi/api/dify/v1/version.py +13 -0
- dify_oapi/api/knowledge_base/__init__.py +0 -0
- dify_oapi/api/knowledge_base/service.py +8 -0
- dify_oapi/api/knowledge_base/v1/__init__.py +0 -0
- dify_oapi/api/knowledge_base/v1/model/__init__.py +0 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/__init__.py +49 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/create_request.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/create_request_body.py +73 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/create_response.py +11 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/dataset_info.py +150 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/delete_request.py +30 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/delete_response.py +9 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/external_knowledge_info.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/filter_condition.py +72 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/get_request.py +30 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/get_response.py +11 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/list_request.py +45 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/list_response.py +13 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/metadata_filtering_conditions.py +30 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/reranking_model.py +28 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/retrieval_model.py +147 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/retrieve_request.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/retrieve_request_body.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/retrieve_response.py +53 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/update_request.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/update_request_body.py +58 -0
- dify_oapi/api/knowledge_base/v1/model/dataset/update_response.py +11 -0
- dify_oapi/api/knowledge_base/v1/model/document/__init__.py +0 -0
- dify_oapi/api/knowledge_base/v1/model/document/create_by_file_request.py +53 -0
- dify_oapi/api/knowledge_base/v1/model/document/create_by_file_request_body.py +31 -0
- dify_oapi/api/knowledge_base/v1/model/document/create_by_file_request_body_data.py +78 -0
- dify_oapi/api/knowledge_base/v1/model/document/create_by_file_response.py +12 -0
- dify_oapi/api/knowledge_base/v1/model/document/create_by_text_request.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/document/create_by_text_request_body.py +80 -0
- dify_oapi/api/knowledge_base/v1/model/document/create_by_text_response.py +12 -0
- dify_oapi/api/knowledge_base/v1/model/document/data_source_info.py +30 -0
- dify_oapi/api/knowledge_base/v1/model/document/delete_request.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/document/delete_response.py +9 -0
- dify_oapi/api/knowledge_base/v1/model/document/document_info.py +164 -0
- dify_oapi/api/knowledge_base/v1/model/document/get_request.py +40 -0
- dify_oapi/api/knowledge_base/v1/model/document/get_response.py +9 -0
- dify_oapi/api/knowledge_base/v1/model/document/get_upload_file_request.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/document/get_upload_file_response.py +11 -0
- dify_oapi/api/knowledge_base/v1/model/document/indexing_status_info.py +80 -0
- dify_oapi/api/knowledge_base/v1/model/document/indexing_status_request.py +36 -0
- dify_oapi/api/knowledge_base/v1/model/document/indexing_status_response.py +11 -0
- dify_oapi/api/knowledge_base/v1/model/document/list_request.py +42 -0
- dify_oapi/api/knowledge_base/v1/model/document/list_response.py +15 -0
- dify_oapi/api/knowledge_base/v1/model/document/pre_processing_rule.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/document/process_rule.py +34 -0
- dify_oapi/api/knowledge_base/v1/model/document/retrieval_model.py +54 -0
- dify_oapi/api/knowledge_base/v1/model/document/rules.py +31 -0
- dify_oapi/api/knowledge_base/v1/model/document/segmentation.py +35 -0
- dify_oapi/api/knowledge_base/v1/model/document/subchunk_segmentation.py +35 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_by_file_request.py +53 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_by_file_request_body.py +26 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_by_file_request_body_data.py +40 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_by_file_response.py +12 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_by_text_request.py +55 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_by_text_request_body.py +46 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_by_text_response.py +14 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_status_request.py +55 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_status_request_body.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/document/update_status_response.py +9 -0
- dify_oapi/api/knowledge_base/v1/model/document/upload_file_info.py +65 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/__init__.py +35 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/create_request.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/create_request_body.py +31 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/create_response.py +13 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/delete_request.py +36 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/delete_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/list_request.py +30 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/list_response.py +9 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/metadata_info.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/toggle_builtin_request.py +36 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/toggle_builtin_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/update_document_request.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/update_document_request_body.py +79 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/update_document_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/update_request.py +44 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/update_request_body.py +24 -0
- dify_oapi/api/knowledge_base/v1/model/metadata/update_response.py +13 -0
- dify_oapi/api/knowledge_base/v1/model/segment/__init__.py +77 -0
- dify_oapi/api/knowledge_base/v1/model/segment/child_chunk_info.py +88 -0
- dify_oapi/api/knowledge_base/v1/model/segment/create_child_chunk_request.py +52 -0
- dify_oapi/api/knowledge_base/v1/model/segment/create_child_chunk_request_body.py +23 -0
- dify_oapi/api/knowledge_base/v1/model/segment/create_child_chunk_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/segment/create_request.py +42 -0
- dify_oapi/api/knowledge_base/v1/model/segment/create_request_body.py +25 -0
- dify_oapi/api/knowledge_base/v1/model/segment/create_response.py +8 -0
- dify_oapi/api/knowledge_base/v1/model/segment/delete_child_chunk_request.py +50 -0
- dify_oapi/api/knowledge_base/v1/model/segment/delete_child_chunk_response.py +5 -0
- dify_oapi/api/knowledge_base/v1/model/segment/delete_request.py +40 -0
- dify_oapi/api/knowledge_base/v1/model/segment/delete_response.py +5 -0
- dify_oapi/api/knowledge_base/v1/model/segment/get_request.py +40 -0
- dify_oapi/api/knowledge_base/v1/model/segment/get_response.py +8 -0
- dify_oapi/api/knowledge_base/v1/model/segment/list_child_chunks_request.py +56 -0
- dify_oapi/api/knowledge_base/v1/model/segment/list_child_chunks_response.py +11 -0
- dify_oapi/api/knowledge_base/v1/model/segment/list_request.py +50 -0
- dify_oapi/api/knowledge_base/v1/model/segment/list_response.py +12 -0
- dify_oapi/api/knowledge_base/v1/model/segment/segment_data.py +43 -0
- dify_oapi/api/knowledge_base/v1/model/segment/segment_info.py +123 -0
- dify_oapi/api/knowledge_base/v1/model/segment/update_child_chunk_request.py +58 -0
- dify_oapi/api/knowledge_base/v1/model/segment/update_child_chunk_request_body.py +23 -0
- dify_oapi/api/knowledge_base/v1/model/segment/update_child_chunk_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/segment/update_request.py +48 -0
- dify_oapi/api/knowledge_base/v1/model/segment/update_request_body.py +25 -0
- dify_oapi/api/knowledge_base/v1/model/segment/update_response.py +8 -0
- dify_oapi/api/knowledge_base/v1/model/tag/__init__.py +41 -0
- dify_oapi/api/knowledge_base/v1/model/tag/bind_request.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/tag/bind_request_body.py +29 -0
- dify_oapi/api/knowledge_base/v1/model/tag/bind_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/tag/create_request.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/tag/create_request_body.py +24 -0
- dify_oapi/api/knowledge_base/v1/model/tag/create_response.py +16 -0
- dify_oapi/api/knowledge_base/v1/model/tag/delete_request.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/tag/delete_request_body.py +24 -0
- dify_oapi/api/knowledge_base/v1/model/tag/delete_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/tag/list_request.py +24 -0
- dify_oapi/api/knowledge_base/v1/model/tag/list_response.py +19 -0
- dify_oapi/api/knowledge_base/v1/model/tag/query_bound_request.py +30 -0
- dify_oapi/api/knowledge_base/v1/model/tag/query_bound_response.py +9 -0
- dify_oapi/api/knowledge_base/v1/model/tag/tag_info.py +38 -0
- dify_oapi/api/knowledge_base/v1/model/tag/unbind_request.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/tag/unbind_request_body.py +29 -0
- dify_oapi/api/knowledge_base/v1/model/tag/unbind_response.py +7 -0
- dify_oapi/api/knowledge_base/v1/model/tag/update_request.py +32 -0
- dify_oapi/api/knowledge_base/v1/model/tag/update_request_body.py +29 -0
- dify_oapi/api/knowledge_base/v1/model/tag/update_response.py +19 -0
- dify_oapi/api/knowledge_base/v1/resource/__init__.py +7 -0
- dify_oapi/api/knowledge_base/v1/resource/dataset.py +58 -0
- dify_oapi/api/knowledge_base/v1/resource/document.py +107 -0
- dify_oapi/api/knowledge_base/v1/resource/metadata.py +65 -0
- dify_oapi/api/knowledge_base/v1/resource/segment.py +110 -0
- dify_oapi/api/knowledge_base/v1/resource/tag.py +65 -0
- dify_oapi/api/knowledge_base/v1/version.py +12 -0
- dify_oapi/api/workflow/__init__.py +0 -0
- dify_oapi/api/workflow/service.py +8 -0
- dify_oapi/api/workflow/v1/__init__.py +0 -0
- dify_oapi/api/workflow/v1/model/__init__.py +0 -0
- dify_oapi/api/workflow/v1/model/get_workflow_log_request.py +50 -0
- dify_oapi/api/workflow/v1/model/get_workflow_log_response.py +42 -0
- dify_oapi/api/workflow/v1/model/get_workflow_result_request.py +30 -0
- dify_oapi/api/workflow/v1/model/get_workflow_result_response.py +17 -0
- dify_oapi/api/workflow/v1/model/run_workflow_request.py +32 -0
- dify_oapi/api/workflow/v1/model/run_workflow_request_body.py +42 -0
- dify_oapi/api/workflow/v1/model/run_workflow_request_file.py +50 -0
- dify_oapi/api/workflow/v1/model/run_workflow_response.py +24 -0
- dify_oapi/api/workflow/v1/model/stop_workflow_request.py +38 -0
- dify_oapi/api/workflow/v1/model/stop_workflow_request_body.py +23 -0
- dify_oapi/api/workflow/v1/model/stop_workflow_response.py +5 -0
- dify_oapi/api/workflow/v1/resource/__init__.py +1 -0
- dify_oapi/api/workflow/v1/resource/workflow.py +102 -0
- dify_oapi/api/workflow/v1/version.py +8 -0
- dify_oapi/client.py +97 -0
- dify_oapi/core/__init__.py +0 -0
- dify_oapi/core/const.py +15 -0
- dify_oapi/core/enum.py +21 -0
- dify_oapi/core/http/__init__.py +0 -0
- dify_oapi/core/http/transport/__init__.py +4 -0
- dify_oapi/core/http/transport/_misc.py +145 -0
- dify_oapi/core/http/transport/async_transport.py +217 -0
- dify_oapi/core/http/transport/sync_transport.py +220 -0
- dify_oapi/core/json.py +61 -0
- dify_oapi/core/log.py +8 -0
- dify_oapi/core/misc.py +41 -0
- dify_oapi/core/model/__init__.py +0 -0
- dify_oapi/core/model/base_request.py +21 -0
- dify_oapi/core/model/base_response.py +27 -0
- dify_oapi/core/model/config.py +9 -0
- dify_oapi/core/model/raw_request.py +5 -0
- dify_oapi/core/model/raw_response.py +17 -0
- dify_oapi/core/model/request_option.py +27 -0
- dify_oapi/core/type.py +5 -0
- dify_oapi/core/utils/__init__.py +0 -0
- dify_oapi/core/utils/strings.py +8 -0
- dify_oapi2-0.1.0.dist-info/LICENSE +21 -0
- dify_oapi2-0.1.0.dist-info/METADATA +295 -0
- dify_oapi2-0.1.0.dist-info/RECORD +255 -0
- 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)
|
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
|
dify_oapi/core/const.py
ADDED
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,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)
|