import gradio as gr import requests import groq import os from dotenv import load_dotenv import urllib.parse import re from sumy.parsers.html import HtmlParser from sumy.nlp.tokenizers import Tokenizer from sumy.summarizers.lsa import LsaSummarizer load_dotenv(verbose=True) # APIキーと検索エンジンID API_KEY = os.environ["API_KEY"] SEARCH_ENGINE_ID = os.environ["SEARCH_ENGINE_ID"] search_active = True # 検索処理の状態を管理するフラグ html = """ プリンス オブ ペルシャ 失われた王冠 - 検索結果

タイトル - 検索結果

プリンス オブ ペルシャ 失われた王冠 | Ubisoft (JP)
""" def generate_prompt(keyword: str): client = groq.Client(api_key=os.environ.get("GROQ_API_KEY")) completion = client.chat.completions.create( model="llama3-70b-8192", messages=[ {"role": "system", "content": "貴方は優秀なプロンプト・エンジニアです。"}, {"role": "user", "content": keyword+"に答えてください。合わせて、主語を含むプロンプトも5つ生成してください。 必ず、日本語で答えてください。"} ], ) return completion.choices[0].message.content def stop_search(): global search_active search_active = False return "検索が停止されました。" def update_prompt(search_text): return search_text def summarize_webpage(url): try: parser = HtmlParser.from_url(url, Tokenizer("japanese")) summarizer = LsaSummarizer() summary = summarizer(parser.document, 5) # 5文で要約 return "\n".join(str(sentence) for sentence in summary) except Exception as e: return f"エラー: {str(e)}" # Google Custom Search API を利用して検索する関数 def google_search(query): global search_active search_active = True # 検索開始時にフラグを True にする yield "" # 初期表示を空にする if not search_active: yield "" # 処理中メッセージを空にする return yield "
処理中...
" if (len(query) == 0): errmsg = ''' エラー - キーワード未入力
⚠️

エラー

キーワードが入力されていません。

''' yield errmsg else: url = f"https://www.googleapis.com/customsearch/v1?q={query}&key={API_KEY}&cx={SEARCH_ENGINE_ID}&sort=date" response = requests.get(url) if response.status_code == 200: data = response.json() #print("respdata:",data) results = [] for item in data.get("items", []): title = item.get("title", "No Title") link = item.get("link", "No Link") snippet = item.get("htmlSnippet", "No Snippet") contents = title + "\n" + snippet results.append(f"{contents}: {link}") # URLデコードを適用 decoded_urls = [urllib.parse.unquote(url) for url in results] decoded ="\n".join(decoded_urls) # 正規表現を使ってタイトルとURLを抽出 matches = re.findall(r'(.+?):\s*(https?://[^\s]+)', decoded) # 結果を表示 finale = "" for title, url in matches: smry = summarize_webpage(url) finale = finale+f'
{title}
{smry}
\n' generated = f"""{query} - 検結果

{query} - 検索結果

""" yield generated else: yield f"検索に失敗しました: {response.status_code}" with gr.Blocks(css="footer {visibility: hidden;} #custom_button {width: 400px; margin: 0 auto; background-color: #E0E7FF;}", theme=gr.themes.Soft(), title="Google カスタム検索エージェント") as agent: gr.HTML('''
Google カスタム検索エージェント
''') with gr.Column(): search_input = gr.Textbox(label="検索キーワードを入力",info="例)著名投資家ウォーレン・バフェット氏が米投資会社バークシャー・ハザウェイの最高経営責任者(CEO)から退く",placeholder="検索するキーワードを入力します。") search_output = gr.HTML(label="検索結果") search_btn = gr.Button("検索",elem_id="custom_button") search_btn.click(google_search, inputs=search_input, outputs=search_output) stop_output = gr.Textbox(label="ステータス") stop_btn = gr.Button("停止",elem_id="custom_button") stop_btn.click(stop_search, inputs=None, outputs=stop_output) with gr.Column(): prompt_input = gr.Textbox( label="検索キーワードを入力", info="例)著名投資家ウォーレン・バフェット氏が米投資会社バークシャー・ハザウェイの最高経営責任者(CEO)から退く", placeholder="検索するキーワードを入力します。", ) prompt_output = gr.Textbox(label="推薦プロンプト") prompt_btn = gr.Button("推薦プロンプト",elem_id="custom_button") prompt_btn.click(generate_prompt, inputs=prompt_input, outputs=prompt_output) # search_input の変更を監視し、prompt_input に反映 search_input.change(update_prompt, inputs=search_input, outputs=prompt_input) agent.launch(favicon_path='favicon.ico')