tregu0458 commited on
Commit
9d7e509
1 Parent(s): 7aee298

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -68
app.py CHANGED
@@ -2,43 +2,59 @@ import os
2
  # 環境変数からDIFY_BASE_URLとDIFY_API_KEY_MYWORKFLOWを取得
3
  DIFY_BASE_URL = os.environ.get("DIFY_BASE_URL", "")
4
  DIFY_API_KEY_MYWORKFLOW = os.environ.get("DIFY_API_KEY_MYWORKFLOW", "")
5
-
6
  import gradio as gr
7
  import requests
8
- from langchain_community.document_loaders import UnstructuredPDFLoader
 
9
  import json
10
 
11
- def run_workflow(message):
12
  try:
13
- file = message['files'][0]
14
- text_message = message['text']
15
-
16
- # PDFファイルが選択されているかチェック
17
- if not file:
18
- return "PDFファイルを選択してください。", ""
19
-
20
- # PDFファイルをロードしてテキストを抽出
21
- loader = UnstructuredPDFLoader(file)
22
- data = loader.load()
23
- raw_text = data[0].page_content
24
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  # APIリクエストのための入力データを準備
26
  inputs = {
27
- "url": "",
28
  "knowledge": raw_text
29
  }
30
-
31
  yield raw_text, "loading...", {}
32
-
33
  # APIエンドポイントURL
34
  url = DIFY_BASE_URL + "/workflows/run"
35
-
36
  # APIリクエストのヘッダー
37
  headers = {
38
  "Content-Type": "application/json",
39
  "Authorization": f"Bearer {DIFY_API_KEY_MYWORKFLOW}"
40
  }
41
-
42
  # APIリクエストのデータ
43
  data = {
44
  "inputs": inputs,
@@ -46,14 +62,14 @@ def run_workflow(message):
46
  "response_mode": "streaming",
47
  "user": "abc_123",
48
  }
49
-
50
  # APIにリクエストを送信
51
  response = requests.post(url, headers=headers, json=data, stream=True)
52
  response.raise_for_status()
53
-
54
  assistant_message = ""
55
  outputs = {}
56
-
57
  # APIレスポンスのチャンク処理
58
  for chunk in response.iter_lines(delimiter=b"\n\n"):
59
  if chunk:
@@ -69,7 +85,7 @@ def run_workflow(message):
69
  elif result.get("event") == "workflow_finished":
70
  outputs = result.get('data', "")
71
  yield raw_text, assistant_message, outputs
72
-
73
  except Exception as e:
74
  error_message = str(e)
75
  print(f"Error: {error_message}")
@@ -78,57 +94,57 @@ def run_workflow(message):
78
  # Gradioインターフェイスの設定
79
  iface = gr.Interface(
80
  fn=run_workflow,
81
- inputs=[gr.MultimodalTextbox(label="PDFファイルをアップロード", file_types=[".pdf"], interactive=True)],
 
82
  outputs=[
83
  gr.Textbox(label="生テキスト", show_copy_button=True, max_lines=5),
84
  gr.Markdown(),
85
  gr.JSON()
86
  ],
87
- title="PDF to Dify Workflow",
88
- description="PDFファイルを入力すると、Dify APIのワークフローによって処理された結果が表示されます。",
89
  article="""
90
-
91
  © 2024 @tregu0458. All rights reserved.
92
-
93
- [利用規約はこちら](https://huggingface.co/spaces/tregu0458/pdf_2_dify_workflow/blob/main/README.md)
94
-
95
- ## 使用コンポーネント
96
- - dify
97
- - gradio
98
- - langchain_community.document_loaders
99
-
100
- ## 今回のworkflowの仕様
101
- ### 入力
102
- - url
103
- - knowledge
104
- ### 出力
105
- - result
106
- - row_content
107
- - url
108
- ### LLM
109
- - gemini-1.5-flash
110
- ```
111
- PDFファイルを入力として受け取り、Dify APIのワークフローを使用してファイルを処理し、結果を返す関数。
112
- Args:
113
- message (dict): 入力メッセージ。以下のキーを含む辞書。
114
- - 'files' (list): アップロードされたPDFファイルのリスト。
115
- - 'text' (str): テキストメッセージ。
116
- Yields:
117
- tuple: 以下の要素を含むタプル。
118
- - raw_text (str): PDFファイルから抽出された生テキスト。
119
- - assistant_message (str): アシスタントからのメッセージ。
120
- - outputs (dict): APIレスポンスのデータ。
121
- Returns:
122
- tuple: 以下の要素を含むタプル。
123
- - status (str): 処理の状態。"error" または "" (空文字列)。
124
- - error_message (str): エラーメッセージ (エラーが発生した場合)。
125
- - data (dict): APIレスポンスのデータ。
126
- Raises:
127
- Exception: 処理中にエラーが発生した場合。
128
- Notes:
129
- - 関数は非同期的に実行され、処理の進行状況に応じて段階的に結果を返す。
130
- - `yield` を使用して、処理の途中経過を表示しながら、最終的な結果を返す。
131
- ```
132
  """
133
  )
134
 
 
2
  # 環境変数からDIFY_BASE_URLとDIFY_API_KEY_MYWORKFLOWを取得
3
  DIFY_BASE_URL = os.environ.get("DIFY_BASE_URL", "")
4
  DIFY_API_KEY_MYWORKFLOW = os.environ.get("DIFY_API_KEY_MYWORKFLOW", "")
 
5
  import gradio as gr
6
  import requests
7
+ from langchain_community.document_loaders import YoutubeLoader, UnstructuredPDFLoader, WebBaseLoader
8
+ from langchain_community.document_loaders import OnlinePDFLoader
9
  import json
10
 
11
+ def run_workflow(message,language='en'):
12
  try:
13
+ if not message.get('text',''):
14
+ file = message['files'][0]
15
+ # PDFファイルをロードしてテキストを抽出
16
+ loader = UnstructuredPDFLoader(file)
17
+ data = loader.load()
18
+ raw_text = data[0].page_content
19
+ else:
20
+ text_message = message.get('text','')
21
+ if "youtube.com" in text_message or "youtu.be" in text_message:
22
+ # YouTubeの場合
23
+ loader = YoutubeLoader.from_youtube_url(
24
+ youtube_url=text_message,
25
+ add_video_info=True,
26
+ language=[language],
27
+ )
28
+ docs = loader.load()
29
+ raw_text = str(docs)
30
+ elif text_message.endswith(".pdf"):
31
+ # PDFの場合
32
+ loader = OnlinePDFLoader(text_message)
33
+ docs = loader.load()
34
+ raw_text = docs[0].page_content
35
+ else:
36
+ # それ以外の場合
37
+ loader = WebBaseLoader(text_message)
38
+ docs = loader.load()
39
+ raw_text = docs[0].page_content
40
+
41
+
42
  # APIリクエストのための入力データを準備
43
  inputs = {
 
44
  "knowledge": raw_text
45
  }
46
+
47
  yield raw_text, "loading...", {}
48
+
49
  # APIエンドポイントURL
50
  url = DIFY_BASE_URL + "/workflows/run"
51
+
52
  # APIリクエストのヘッダー
53
  headers = {
54
  "Content-Type": "application/json",
55
  "Authorization": f"Bearer {DIFY_API_KEY_MYWORKFLOW}"
56
  }
57
+
58
  # APIリクエストのデータ
59
  data = {
60
  "inputs": inputs,
 
62
  "response_mode": "streaming",
63
  "user": "abc_123",
64
  }
65
+
66
  # APIにリクエストを送信
67
  response = requests.post(url, headers=headers, json=data, stream=True)
68
  response.raise_for_status()
69
+
70
  assistant_message = ""
71
  outputs = {}
72
+
73
  # APIレスポンスのチャンク処理
74
  for chunk in response.iter_lines(delimiter=b"\n\n"):
75
  if chunk:
 
85
  elif result.get("event") == "workflow_finished":
86
  outputs = result.get('data', "")
87
  yield raw_text, assistant_message, outputs
88
+
89
  except Exception as e:
90
  error_message = str(e)
91
  print(f"Error: {error_message}")
 
94
  # Gradioインターフェイスの設定
95
  iface = gr.Interface(
96
  fn=run_workflow,
97
+ inputs=[gr.MultimodalTextbox(label="PDFファイルをアップロード", file_types=[".pdf"], interactive=True),
98
+ gr.Dropdown(label="Language",value="ja",choices=["en","en-US", "ja", "fr","de","it"],allow_custom_value=True)],
99
  outputs=[
100
  gr.Textbox(label="生テキスト", show_copy_button=True, max_lines=5),
101
  gr.Markdown(),
102
  gr.JSON()
103
  ],
104
+ title="Documnet to Dify Workflow",
105
+ description="このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。",
106
  article="""
107
+
108
  © 2024 @tregu0458. All rights reserved.
109
+
110
+ # PDF、YouTube、Web URLを入力としたDifyワークフロー
111
+
112
+ このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。PDFファイルをアップロードするか、YouTube URLを提供するか、Web URLを入力するだけで、ワークフローがテキストコンテンツを抽出し、Dify APIを使用して処理します。
113
+
114
+ ## 特徴
115
+ - PDFファイル、YouTube動画、Webページを入力として対応
116
+ - `langchain_community.document_loaders`の`UnstructuredPDFLoader`と`OnlinePDFLoader`を使用してPDFファイルからテキストを抽出
117
+ - `langchain_community.document_loaders`の`YoutubeLoader`を使用してYouTube動画からテキストを抽出
118
+ - `langchain_community.document_loaders`の`WebBaseLoader`を使用してWebページからテキストを抽出
119
+ - 抽出されたテキストをDify APIワークフローで処理
120
+ - リアルタイム更新のためのストリーミングレスポンス処理
121
+ - 生テキスト、処理されたテキスト、JSON出力の表示
122
+
123
+ ## 使用方法
124
+ 1. 入力フィールドにPDFファイルをアップロードするか、YouTube URLを提供するか、Web URLを入力します。
125
+ 2. ドロップダウンから希望の言語を選択します(デフォルトは "ja")。
126
+ 3. "Submit"ボタンをクリックして処理を開始します。
127
+ 4. インターフェイスには、入力から抽出された生テキスト、Dify APIから処理されたテキスト、JSON出力が表示されます。
128
+
129
+ ## 使用コンポーネント
130
+ - Dify API
131
+ - Gradio
132
+ - langchain_community.document_loaders
133
+
134
+ ## ワークフローの仕様
135
+ ### 入力
136
+ - Knowledge
137
+ ### 出力
138
+ - Result
139
+ - Raw Content
140
+ ### LLM
141
+ - gemini-1.5-flash-latest
142
+
143
+ ## 注意事項
144
+ - 処理は非同期的に実行され、ワークフローの進行に合わせてリアルタイムで結果が表示されます。
145
+ - `yield`文を使用して、処理の途中経過を表示しながら、最終的な結果を返します。
146
+ - エラー処理は、処理中に発生する可能性のある例外をキャッチして表示するように実装されています。
147
+ `run_workflow`関数は、入力メッセージを受け取り、指定された言語でDify APIワークフローを使用して処理を実行します。関数内では、入力タイプ(PDFファイル、YouTube URL、Web URL)に応じて適切なローダーを使用してテキストを抽出し、Dify APIにリクエストを送信して処理を行います。処理の進行状況に応じて、`yield`文を使用して中間結果を表示し、最終的な結果を返します。エラーが発生した場合は、例外をキャッチして適切なエラーメッセージを表示します。
 
148
  """
149
  )
150