tregu0458's picture
Update app.py
ef8865f verified
raw
history blame
No virus
5.23 kB
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()