CoolFace
Apppublic

tregu0458/pdf_2_dify_workflow

sourceHugging Faceupdated 2y agoView on Hugging Face
1likes
app.py146 linesDownload Raw Back to root
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()