File size: 7,310 Bytes
d1c6a20
 
 
 
7cadf12
 
9d7e509
 
7cadf12
 
6e263a2
7cadf12
9d7e509
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
517abe1
9d7e509
 
 
 
517abe1
 
9d7e509
 
aac3489
7cadf12
 
 
9d7e509
e88bef3
9d7e509
aac3489
7cadf12
9d7e509
aac3489
7cadf12
 
 
 
9d7e509
aac3489
7cadf12
 
 
 
 
 
9d7e509
aac3489
7cadf12
 
9d7e509
7cadf12
 
9d7e509
aac3489
7cadf12
 
 
 
 
 
 
 
 
 
aac3489
7cadf12
 
aac3489
9d7e509
7cadf12
 
 
 
 
e88bef3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7cadf12
 
e88bef3
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
137
138
139
140
141
142
143
144
145
146
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 YoutubeLoader, UnstructuredPDFLoader, WebBaseLoader
from langchain_community.document_loaders import OnlinePDFLoader
import json

def run_workflow(message,language='en'):
    try:
        if not message.get('text',''):
            file = message['files'][0]
            # PDFファイルをロードしてテキストを抽出
            loader = UnstructuredPDFLoader(file)
            data = loader.load()
            raw_text = data[0].page_content
        else:
          text_message = message.get('text','')
          if "youtube.com" in text_message or "youtu.be" in text_message:
              # YouTubeの場合
              loader = YoutubeLoader.from_youtube_url(
                  youtube_url=text_message,
                  add_video_info=True,
                  language=[language],
              )
              docs = loader.load()
              raw_text = str(docs)
          elif text_message.endswith(".pdf"):
              # PDFの場合
              loader = OnlinePDFLoader(text_message)
              docs = loader.load()
              raw_text = docs[0].page_content
          elif text_message.startswith("http") or text_message.startswith("https"):
              # それ以外の場合
              loader = WebBaseLoader(text_message)
              docs = loader.load()
              raw_text = docs[0].page_content
          else:
              raw_text = text_message


        # APIリクエストのための入力データを準備
        inputs = {
            "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),
            gr.Dropdown(label="Language",value="ja",choices=["en","en-US", "ja", "fr","de","it"],allow_custom_value=True)],
    outputs=[
        gr.Textbox(label="生テキスト", show_copy_button=True, max_lines=5),
        gr.Markdown(),
        gr.JSON()
    ],
    title="Documnet to Dify Workflow",
    description="このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。",
    article="""
    © 2024 @tregu0458. All rights reserved.
# PDF、YouTube、Web URLを入力としたDifyワークフロー
このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。PDFファイルをアップロードするか、YouTube URLを提供するか、Web URLを入力するだけで、ワークフローがテキストコンテンツを抽出し、Dify APIを使用して処理します。
## 特徴
- PDFファイル、YouTube動画、Webページを入力として対応
- `langchain_community.document_loaders`の`UnstructuredPDFLoader`と`OnlinePDFLoader`を使用してPDFファイルからテキストを抽出
- `langchain_community.document_loaders`の`YoutubeLoader`を使用してYouTube動画からテキストを抽出
- `langchain_community.document_loaders`の`WebBaseLoader`を使用してWebページからテキストを抽出
- 抽出されたテキストをDify APIワークフローで処理
- リアルタイム更新のためのストリーミングレスポンス処理
- 生テキスト、処理されたテキスト、JSON出力の表示
## 使用方法
1. 入力フィールドにPDFファイルをアップロードするか、YouTube URLを提供するか、Web URLを入力します。
2. ドロップダウンから希望の言語を選択します(デフォルトは "ja")。
3. "Submit"ボタンをクリックして処理を開始します。
4. インターフェイスには、入力から抽出された生テキスト、Dify APIから処理されたテキスト、JSON出力が表示されます。
## 使用コンポーネント
- Dify API
- Gradio
- langchain_community.document_loaders
## ワークフローの仕様
### 入力
- Knowledge
### 出力
- Result
- Raw Content
### LLM
- gemini-1.5-flash-latest
## 注意事項
- 処理は非同期的に実行され、ワークフローの進行に合わせてリアルタイムで結果が表示されます。
- `yield`文を使用して、処理の途中経過を表示しながら、最終的な結果を返します。
- エラー処理は、処理中に発生する可能性のある例外をキャッチして表示するように実装されています。
`run_workflow`関数は、入力メッセージを受け取り、指定された言語でDify APIワークフローを使用して処理を実行します。関数内では、入力タイプ(PDFファイル、YouTube URL、Web URL)に応じて適切なローダーを使用してテキストを抽出し、Dify APIにリクエストを送信して処理を行います。処理の進行状況に応じて、`yield`文を使用して中間結果を表示し、最終的な結果を返します。エラーが発生した場合は、例外をキャッチして適切なエラーメッセージを表示します。
    """
)

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