tregu0458/pdf_2_dify_workflow
1
1import os2# 環境変数からDIFY_BASE_URLとDIFY_API_KEY_MYWORKFLOWを取得3DIFY_BASE_URL = os.environ.get("DIFY_BASE_URL", "")4DIFY_API_KEY_MYWORKFLOW = os.environ.get("DIFY_API_KEY_MYWORKFLOW", "")5import gradio as gr6import requests7from langchain_community.document_loaders import YoutubeLoader, UnstructuredPDFLoader, WebBaseLoader8from langchain_community.document_loaders import OnlinePDFLoader9import json10 11def 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_content19 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_content35 elif text_message.startswith("http") or text_message.startswith("https"):36 # それ以外の場合37 loader = WebBaseLoader(text_message)38 docs = loader.load()39 raw_text = docs[0].page_content40 else:41 raw_text = text_message42 43 44 # APIリクエストのための入力データを準備45 inputs = {46 "knowledge": raw_text47 }48 49 yield raw_text, "loading...", {}50 51 # APIエンドポイントURL52 url = DIFY_BASE_URL + "/workflows/run"53 54 # APIリクエストのヘッダー55 headers = {56 "Content-Type": "application/json",57 "Authorization": f"Bearer {DIFY_API_KEY_MYWORKFLOW}"58 }59 60 # APIリクエストのデータ61 data = {62 "inputs": inputs,63 "query": "",64 "response_mode": "streaming",65 "user": "abc_123",66 }67 68 # APIにリクエストを送信69 response = requests.post(url, headers=headers, json=data, stream=True)70 response.raise_for_status()71 72 assistant_message = ""73 outputs = {}74 75 # APIレスポンスのチャンク処理76 for chunk in response.iter_lines(delimiter=b"\n\n"):77 if chunk:78 chunk_data = chunk.decode("utf-8").strip()79 if chunk_data.startswith("data:"):80 json_data = chunk_data[6:] # "data: "を取り除く81 if json_data:82 result = json.loads(json_data)83 if result.get("event") == "text_chunk":84 answer = result.get("data", "").get("text", "")85 assistant_message += str(answer)86 yield raw_text, assistant_message, result.get("data", "")87 elif result.get("event") == "workflow_finished":88 outputs = result.get('data', "")89 yield raw_text, assistant_message, outputs90 91 except Exception as e:92 error_message = str(e)93 print(f"Error: {error_message}")94 return "error", error_message, {}95 96# Gradioインターフェイスの設定97iface = gr.Interface(98 fn=run_workflow,99 inputs=[gr.MultimodalTextbox(label="PDFファイルをアップロード", file_types=[".pdf"], interactive=True),100 gr.Dropdown(label="Language",value="ja",choices=["en","en-US", "ja", "fr","de","it"],allow_custom_value=True)],101 outputs=[102 gr.Textbox(label="生テキスト", show_copy_button=True, max_lines=5),103 gr.Markdown(),104 gr.JSON()105 ],106 title="Documnet to Dify Workflow",107 description="このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。",108 article="""109 © 2024 @tregu0458. All rights reserved.110# PDF、YouTube、Web URLを入力としたDifyワークフロー111このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。PDFファイルをアップロードするか、YouTube URLを提供するか、Web URLを入力するだけで、ワークフローがテキストコンテンツを抽出し、Dify APIを使用して処理します。112## 特徴113- PDFファイル、YouTube動画、Webページを入力として対応114- `langchain_community.document_loaders`の`UnstructuredPDFLoader`と`OnlinePDFLoader`を使用してPDFファイルからテキストを抽出115- `langchain_community.document_loaders`の`YoutubeLoader`を使用してYouTube動画からテキストを抽出116- `langchain_community.document_loaders`の`WebBaseLoader`を使用してWebページからテキストを抽出117- 抽出されたテキストをDify APIワークフローで処理118- リアルタイム更新のためのストリーミングレスポンス処理119- 生テキスト、処理されたテキスト、JSON出力の表示120## 使用方法1211. 入力フィールドにPDFファイルをアップロードするか、YouTube URLを提供するか、Web URLを入力します。1222. ドロップダウンから希望の言語を選択します(デフォルトは "ja")。1233. "Submit"ボタンをクリックして処理を開始します。1244. インターフェイスには、入力から抽出された生テキスト、Dify APIから処理されたテキスト、JSON出力が表示されます。125## 使用コンポーネント126- Dify API127- Gradio128- langchain_community.document_loaders129## ワークフローの仕様130### 入力131- Knowledge132### 出力133- Result134- Raw Content135### LLM136- gemini-1.5-flash-latest137## 注意事項138- 処理は非同期的に実行され、ワークフローの進行に合わせてリアルタイムで結果が表示されます。139- `yield`文を使用して、処理の途中経過を表示しながら、最終的な結果を返します。140- エラー処理は、処理中に発生する可能性のある例外をキャッチして表示するように実装されています。141`run_workflow`関数は、入力メッセージを受け取り、指定された言語でDify APIワークフローを使用して処理を実行します。関数内では、入力タイプ(PDFファイル、YouTube URL、Web URL)に応じて適切なローダーを使用してテキストを抽出し、Dify APIにリクエストを送信して処理を行います。処理の進行状況に応じて、`yield`文を使用して中間結果を表示し、最終的な結果を返します。エラーが発生した場合は、例外をキャッチして適切なエラーメッセージを表示します。142 """143)144 145if __name__ == "__main__":146 iface.queue().launch()