Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from duckduckgo_search import DDGS | |
| from swarm import Swarm, Agent | |
| from datetime import datetime | |
| import re | |
| current_date = datetime.now().strftime("%Y-%m") | |
| client = Swarm() | |
| def contains_chinese(text): | |
| """μ€κ΅μ΄ λ¬Έμ ν¬ν¨ μ¬λΆ νμΈ""" | |
| return any('\u4e00' <= char <= '\u9fff' for char in text) | |
| def get_news_articles(topic, date=None): | |
| print(f"Running DuckDuckGo news search for {topic}...") | |
| ddg_api = DDGS() | |
| search_query = f"{topic} {date if date else current_date}" | |
| results = ddg_api.news(search_query, max_results=10) | |
| if results: | |
| # "https://www.msn.com" URLμ ν¬ν¨νμ§ μμ λ΄μ€λ§ νν°λ§ | |
| filtered_results = [ | |
| result for result in results | |
| if "https://www.msn.com" not in result['url'] | |
| ] | |
| if filtered_results: | |
| news_results = "\n\n".join([ | |
| f"**μ λͺ©**: {result['title']}\n**λ§ν¬**: {result['url']}\n**λ΄μ©**: {result['body']}" | |
| for result in filtered_results | |
| ]) | |
| return news_results | |
| else: | |
| return f"{topic}μ λν λ΄μ€λ₯Ό μ°Ύμ μ μμ΅λλ€." | |
| else: | |
| return f"{topic}μ λν λ΄μ€λ₯Ό μ°Ύμ μ μμ΅λλ€." | |
| news_agent = Agent( | |
| name="News Assistant", | |
| instructions=""" | |
| λΉμ μ DuckDuckGo κ²μμ μ¬μ©νμ¬ μ£Όμ΄μ§ μ£Όμ μ λν μ€λμ μ΅μ λ΄μ€ κΈ°μ¬λ₯Ό μ 곡ν©λλ€. | |
| λ°λμ νκ΅μ΄λ‘λ§ μλ΅νμμμ€. | |
| μ€κ΅μ΄κ° ν¬ν¨λ λ΄μ©μ΄ μλ€λ©΄ νκ΅μ΄λ‘ λ²μνμ¬ μ 곡νμμμ€. | |
| νμ μλ΅μ μ 체 URLμ ν¬ν¨νμμμ€. | |
| κ° λ΄μ€ κΈ°μ¬μ λν λ μ§λ₯Ό ν¬ν¨νμμμ€. | |
| """, | |
| functions=[get_news_articles], | |
| model="qwen2.5:latest" | |
| ) | |
| editor_agent = Agent( | |
| name="Editor Assistant", | |
| instructions=""" | |
| λΉμ μ λ΄μ€ νΈμ§μμ λλ€. λ€μ κ·μΉμ λ°λΌ λ΄μ€λ₯Ό νκ΅μ΄λ‘ νΈμ§ν΄μ£ΌμΈμ: | |
| 1. κ° λ΄μ€λ λ³λμ μΉμ μΌλ‘ ꡬλΆνμ¬ μμ± | |
| 2. λͺ¨λ μλ³Έ URLμ λ°λμ ν¬ν¨ | |
| 3. κ° κΈ°μ¬μ λ μ§ ν¬ν¨ | |
| 4. μ€μ λ΄μ©μ ** λ³Όλ체 μ²λ¦¬ | |
| 5. URLμ [μ λͺ©](URL) νμμΌλ‘ ν¬ν¨ | |
| 6. λ°λμ νκ΅μ΄λ‘ μμ±νκ³ , μ€κ΅μ΄κ° ν¬ν¨λ λ΄μ©μ νκ΅μ΄λ‘ λ²μνμ¬ μ 곡 | |
| 7. κ° κΈ°μ¬λ 200λ¨μ΄ μ΄λ΄λ‘ μμ½ | |
| """, | |
| model="qwen2.5:latest" | |
| ) | |
| def process_news_request(topic, progress=gr.Progress(track_tqdm=True)): | |
| try: | |
| progress(0, desc="μμνλ μ€...") | |
| progress(0.3, desc="λ΄μ€ κ²μ μ€...") | |
| news_response = client.run( | |
| agent=news_agent, | |
| messages=[{"role": "user", "content": f"νκ΅μ΄λ‘ {topic}μ λν μ΅μ λ΄μ€λ₯Ό μ°Ύμμ£ΌμΈμ."}], | |
| ) | |
| raw_news = news_response.messages[-1]["content"] | |
| # μλ³Έ λ΄μ€μμ μ€κ΅μ΄κ° ν¬ν¨λ νλͺ© μ κ±° | |
| raw_news_list = raw_news.split("\n\n") | |
| filtered_news_list = [news for news in raw_news_list if not contains_chinese(news)] | |
| # MSN URLμ΄ ν¬ν¨λ νλͺ©λ μ κ±° | |
| filtered_news_list = [news for news in filtered_news_list if "https://www.msn.com" not in news] | |
| filtered_news = "\n\n".join(filtered_news_list) | |
| progress(0.6, desc="λ΄μ€ νΈμ§ μ€...") | |
| edited_news_response = client.run( | |
| agent=editor_agent, | |
| messages=[{"role": "user", "content": f"λ€μ λ΄μ€λ₯Ό νκ΅μ΄λ‘ νΈμ§ν΄μ£ΌμΈμ:\n{filtered_news}"}], | |
| ) | |
| progress(1.0, desc="μλ£!") | |
| return edited_news_response.messages[-1]["content"] | |
| except Exception as e: | |
| return f"μ€λ₯κ° λ°μνμ΅λλ€: {str(e)}\n\nλλ²κ·Έ μ 보: {type(e).__name__}" | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# π€ Swarm AI λ΄μ€ μμ΄μ νΈ") | |
| with gr.Row(): | |
| topic_input = gr.Textbox( | |
| label="κ²μν μ£Όμ λ₯Ό μ λ ₯νμΈμ", | |
| placeholder="μ: AI, SpaceX, Blockchain...", | |
| lines=1 | |
| ) | |
| with gr.Row(): | |
| submit_btn = gr.Button("κ²μ", variant="primary") | |
| with gr.Row(): | |
| result_output = gr.Markdown( | |
| value="Swarm AIλ₯Ό νμ©ν΄μ Ollama qwen2.5 λͺ¨λΈμ΄ μ¬μ©μκ° μμ²ν μ΅μ λ΄μ€λ₯Ό κ²μνκ³ νκ΅μ΄λ‘ μμ½ν΄λ립λλ€.", | |
| label="AIκ° μ 리ν λ΄μ€" | |
| ) | |
| examples = gr.Examples( | |
| examples=[ | |
| ["μΈκ³΅μ§λ₯"], | |
| ["ν μ¬λΌ"], | |
| ["OpenAI"], | |
| ["κΈ°νλ³ν"] | |
| ], | |
| inputs=topic_input | |
| ) | |
| submit_btn.click( | |
| fn=process_news_request, | |
| inputs=topic_input, | |
| outputs=result_output | |
| ) | |
| topic_input.submit( | |
| fn=process_news_request, | |
| inputs=topic_input, | |
| outputs=result_output | |
| ) | |
| if __name__ == "__main__": | |
| demo.queue().launch(share=True) |