rbgo's picture
Update app.py
93a1b8c verified
import streamlit as st
import requests
import json
import time
import os
api_url = os.getenv("API_URL")
auth_token = os.getenv("AUTH_TOKEN")
# Set page config
st.set_page_config(
page_title="Product Hunt Thread Summarizer",
layout="wide",
initial_sidebar_state="collapsed"
)
# Custom CSS for header and banners
st.markdown(
"""
<style>
/* Main header with Product Hunt icon */
#main-header {
display: flex;
align-items: center;
margin-bottom: 10px;
}
#main-header img {
width: 50px;
height: 50px;
margin-right: 15px;
border-radius: 4px;
}
#main-header h1 {
font-size: 32px;
margin: 0;
color: #333;
}
/* Inferless banner without border */
#inferless-banner {
display: flex;
align-items: center;
background-color: #ffffff;
padding: 10px 15px;
margin-bottom: 20px;
border-radius: 8px;
}
#inferless-banner img {
width: 40px;
height: 40px;
margin-right: 10px;
border-radius: 4px;
}
#inferless-banner .inferless-text {
font-size: 18px;
font-weight: 600;
color: #333;
}
</style>
""",
unsafe_allow_html=True
)
# Main header: Product Hunt Thread Summarizer with Product Hunt icon
st.markdown(
"""
<div id="main-header">
<img src="https://i.tracxn.com/logo/company/588f54924f2a60b6aae128ac436d95a4?format=webp&height=120&width=120" alt="Product Hunt Logo">
<h1>Product Hunt Thread Summarizer</h1>
</div>
""",
unsafe_allow_html=True
)
# Powered by Inferless banner (without border)
st.markdown(
"""
<div id="inferless-banner">
<img src="https://i.tracxn.com/logo/company/1678863153264_9e6a9a4d-b955-42b3-895e-b94ade13c997.jpeg?format=webp&height=120&width=120" alt="Inferless Logo">
<div class="inferless-text">Powered by Inferless</div>
</div>
""",
unsafe_allow_html=True
)
# Input field for thread URL
thread_url = st.text_input(
label="Enter URL",
placeholder="https://www.producthunt.com/p/graphite/you-re-doing-code-reviews-wrong-ama-w-ceo-of-graphite",
help="Paste the URL you want to summarize"
)
# Button to call your local inference API
if st.button("Summarize"):
if thread_url.strip():
with st.spinner("Analyzing thread..."):
# Build request payload
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {auth_token}'
}
payload = {
"inputs": [
{
"name": "url",
"shape": [1],
"data": [thread_url],
"datatype": "BYTES"
},
{
"name": "temperature",
"optional": True,
"shape": [1],
"data": [0.15],
"datatype": "FP64"
},
{
"name": "top_p",
"optional": True,
"shape": [1],
"data": [1],
"datatype": "FP64"
},
{
"name": "repetition_penalty",
"optional": True,
"shape": [1],
"data": [1],
"datatype": "FP64"
},
{
"name": "top_k",
"optional": True,
"shape": [1],
"data": [-1],
"datatype": "INT32"
},
{
"name": "max_tokens",
"optional": True,
"shape": [1],
"data": [1024],
"datatype": "INT32"
},
{
"name": "seed",
"optional": True,
"shape": [1],
"data": [4424234],
"datatype": "INT32"
}
]
}
try:
# Send POST request to your local model server
response = requests.post(api_url, headers=headers, json=payload,timeout=300)
response.raise_for_status() # Raise HTTPError if status != 200
# Parse JSON response
data = response.json()
summary_text = data["outputs"][0]["data"][0]
# Display the result in Streamlit
st.markdown("### Summary")
st.write(summary_text)
except requests.exceptions.RequestException as e:
st.error(f"Error calling the model API: {e}")
else:
st.error("Please enter a valid URL.")