Spaces:
Sleeping
Sleeping
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() |