Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,64 +1,93 @@
|
|
1 |
-
import
|
2 |
-
|
|
|
|
|
|
|
|
|
3 |
|
4 |
-
|
5 |
-
|
6 |
-
"""
|
7 |
-
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
|
8 |
|
|
|
|
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
max_tokens,
|
15 |
-
temperature,
|
16 |
-
top_p,
|
17 |
-
):
|
18 |
-
messages = [{"role": "system", "content": system_message}]
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
messages.append({"role": "user", "content": val[0]})
|
23 |
-
if val[1]:
|
24 |
-
messages.append({"role": "assistant", "content": val[1]})
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import requests
|
3 |
+
import os
|
4 |
+
import json
|
5 |
+
import boto3
|
6 |
+
from dotenv import load_dotenv
|
7 |
|
8 |
+
# API Key (Ensure security; do not share publicly)
|
9 |
+
# API_KEY = "67bd857847938bebf6b0ff82a26ba45f251986f3"
|
|
|
|
|
10 |
|
11 |
+
# Define the API endpoint
|
12 |
+
# API_URL = "https://google.serper.dev/search"
|
13 |
|
14 |
+
# Load API keys from .env file
|
15 |
+
load_dotenv()
|
16 |
+
NEWS_API_KEY = "3d542da6aaa94a79ad7d2b852e944dac"
|
17 |
+
SERPER_API_KEY = "67bd857847938bebf6b0ff82a26ba45f251986f3"
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
+
# Claude 3 via AWS Bedrock
|
20 |
+
bedrock = boto3.client("bedrock-runtime", region_name=os.getenv("AWS_REGION"))
|
|
|
|
|
|
|
21 |
|
22 |
+
# Streamlit app UI
|
23 |
+
st.title("📰 News Summarizer Agent")
|
24 |
+
topic = st.text_input("Enter a topic, company name, or keyword:")
|
25 |
|
26 |
+
# Fetch news from NewsAPI
|
27 |
+
def fetch_newsapi_news(topic):
|
28 |
+
url = f"https://newsapi.org/v2/everything?q={topic}&pageSize=5&sortBy=publishedAt&apiKey={NEWS_API_KEY}"
|
29 |
+
response = requests.get(url)
|
30 |
+
articles = response.json().get("articles", [])
|
31 |
+
return [{"title": a["title"], "description": a["description"], "url": a["url"]} for a in articles]
|
32 |
|
33 |
+
# Fetch news from Serper.dev
|
34 |
+
def fetch_serper_news(topic):
|
35 |
+
url = "https://google.serper.dev/news"
|
36 |
+
headers = {"X-API-KEY": SERPER_API_KEY, "Content-Type": "application/json"}
|
37 |
+
data = {"q": topic}
|
38 |
+
response = requests.post(url, headers=headers, data=json.dumps(data))
|
39 |
+
results = response.json().get("news", [])[:5]
|
40 |
+
return [{"title": r["title"], "description": r.get("snippet", ""), "url": r["link"]} for r in results]
|
41 |
|
42 |
+
# Summarize with Claude 3
|
43 |
+
def summarize_with_claude(article):
|
44 |
+
messages = [
|
45 |
+
{
|
46 |
+
"role": "user",
|
47 |
+
"content": f"""You are a helpful news summarizer agent.
|
48 |
+
Given the article title and description, generate:
|
49 |
+
1. A more relevant headline based on the topic
|
50 |
+
2. A 3-5 line clear and concise summary.
|
51 |
|
52 |
+
Title: {article['title']}
|
53 |
+
Description: {article['description']}
|
54 |
|
55 |
+
Respond as:
|
56 |
+
Headline: ...
|
57 |
+
Summary: ...
|
58 |
"""
|
59 |
+
}
|
60 |
+
]
|
61 |
+
|
62 |
+
body = {
|
63 |
+
"messages": messages,
|
64 |
+
"max_tokens": 300,
|
65 |
+
"temperature": 0.7,
|
66 |
+
"anthropic_version": "bedrock-2023-05-31" # REQUIRED
|
67 |
+
}
|
68 |
+
|
69 |
+
response = bedrock.invoke_model(
|
70 |
+
modelId="anthropic.claude-3-sonnet-20240229-v1:0",
|
71 |
+
body=json.dumps(body),
|
72 |
+
contentType="application/json",
|
73 |
+
accept="application/json"
|
74 |
+
)
|
75 |
+
|
76 |
+
result = json.loads(response["body"].read())
|
77 |
+
return result["content"][0]["text"].strip()
|
78 |
+
|
79 |
+
# Button and main logic
|
80 |
+
if st.button("Get News"):
|
81 |
+
if not topic:
|
82 |
+
st.warning("Please enter a topic.")
|
83 |
+
else:
|
84 |
+
st.subheader("Fetching top news...")
|
85 |
+
news_items = fetch_newsapi_news(topic) + fetch_serper_news(topic)
|
86 |
+
|
87 |
+
for idx, article in enumerate(news_items[:5]):
|
88 |
+
st.markdown(f"### 🗞️ News #{idx+1}")
|
89 |
+
st.markdown(f"[Original Article]({article['url']})")
|
90 |
+
|
91 |
+
with st.spinner("Generating summary..."):
|
92 |
+
summary = summarize_with_claude(article)
|
93 |
+
st.markdown(summary)
|