File size: 5,227 Bytes
d1c6a20
 
 
 
aac3489
7cadf12
 
 
 
 
aac3489
7cadf12
aac3489
59fa2dd
aac3489
0251c39
 
 
 
aac3489
7cadf12
 
 
aac3489
 
7cadf12
 
 
 
aac3489
 
 
 
7cadf12
aac3489
 
7cadf12
 
 
 
aac3489
 
7cadf12
 
 
 
 
 
aac3489
 
7cadf12
 
aac3489
7cadf12
 
aac3489
 
7cadf12
 
 
 
 
 
 
 
 
 
aac3489
7cadf12
 
aac3489
 
7cadf12
 
 
 
 
aac3489
7cadf12
 
aac3489
7cadf12
 
 
 
 
 
aac3489
1db0408
5265275
aac3489
ef8865f
 
aac3489
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7cadf12
 
af2d02b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import os
# 環境変数からDIFY_BASE_URLとDIFY_API_KEY_MYWORKFLOWを取得
DIFY_BASE_URL = os.environ.get("DIFY_BASE_URL", "")
DIFY_API_KEY_MYWORKFLOW = os.environ.get("DIFY_API_KEY_MYWORKFLOW", "")

import gradio as gr
import requests
from langchain_community.document_loaders import UnstructuredPDFLoader
import json

def run_workflow(message):
    try:
        file = message['files'][0]
        text_message = message['text']
        
        # PDFファイルが選択されているかチェック
        if not file:
            return "PDFファイルを選択してください。", ""
        
        # PDFファイルをロードしてテキストを抽出
        loader = UnstructuredPDFLoader(file)
        data = loader.load()
        raw_text = data[0].page_content
        
        # APIリクエストのための入力データを準備
        inputs = {
            "url": "",
            "knowledge": raw_text
        }
        
        yield raw_text, "loading...", {}
        
        # APIエンドポイントURL
        url = DIFY_BASE_URL + "/workflows/run"
        
        # APIリクエストのヘッダー
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {DIFY_API_KEY_MYWORKFLOW}"
        }
        
        # APIリクエストのデータ
        data = {
            "inputs": inputs,
            "query": "",
            "response_mode": "streaming",
            "user": "abc_123",
        }
        
        # APIにリクエストを送信
        response = requests.post(url, headers=headers, json=data, stream=True)
        response.raise_for_status()
        
        assistant_message = ""
        outputs = {}
        
        # APIレスポンスのチャンク処理
        for chunk in response.iter_lines(delimiter=b"\n\n"):
            if chunk:
                chunk_data = chunk.decode("utf-8").strip()
                if chunk_data.startswith("data:"):
                    json_data = chunk_data[6:]  # "data: "を取り除く
                    if json_data:
                        result = json.loads(json_data)
                        if result.get("event") == "text_chunk":
                            answer = result.get("data", "").get("text", "")
                            assistant_message += str(answer)
                            yield raw_text, assistant_message, result.get("data", "")
                        elif result.get("event") == "workflow_finished":
                            outputs = result.get('data', "")
                            yield raw_text, assistant_message, outputs
        
    except Exception as e:
        error_message = str(e)
        print(f"Error: {error_message}")
        return "error", error_message, {}

# Gradioインターフェイスの設定
iface = gr.Interface(
    fn=run_workflow,
    inputs=[gr.MultimodalTextbox(label="PDFファイルをアップロード", file_types=[".pdf"], interactive=True)],
    outputs=[
        gr.Textbox(label="生テキスト", show_copy_button=True, max_lines=5),
        gr.Markdown(),
        gr.JSON()
    ],
    title="PDF to Dify Workflow",
    description="PDFファイルを入力すると、Dify APIのワークフローによって処理された結果が表示されます。",
    article="""
    
    © 2024 @tregu0458. All rights reserved.
    
    [利用規約はこちら](https://huggingface.co/spaces/tregu0458/pdf_2_dify_workflow/blob/main/README.md)
    
    ## 使用コンポーネント
    - dify
    - gradio
    - langchain_community.document_loaders
    
    ## 今回のworkflowの仕様
    ### 入力
    - url
    - knowledge
    ### 出力
    - result
    - row_content
    - url
    ### LLM
    - gemini-1.5-flash
    ```
        PDFファイルを入力として受け取り、Dify APIのワークフローを使用してファイルを処理し、結果を返す関数。
        Args:
            message (dict): 入力メッセージ。以下のキーを含む辞書。
                - 'files' (list): アップロードされたPDFファイルのリスト。
                - 'text' (str): テキストメッセージ。
        Yields:
            tuple: 以下の要素を含むタプル。
                - raw_text (str): PDFファイルから抽出された生テキスト。
                - assistant_message (str): アシスタントからのメッセージ。
                - outputs (dict): APIレスポンスのデータ。
        Returns:
            tuple: 以下の要素を含むタプル。
                - status (str): 処理の状態。"error" または "" (空文字列)。
                - error_message (str): エラーメッセージ (エラーが発生した場合)。
                - data (dict): APIレスポンスのデータ。
        Raises:
            Exception: 処理中にエラーが発生した場合。
        Notes:
            - 関数は非同期的に実行され、処理の進行状況に応じて段階的に結果を返す。
            - `yield` を使用して、処理の途中経過を表示しながら、最終的な結果を返す。
    ```
    """
)

if __name__ == "__main__":
    iface.queue().launch()