import io import streamlit as st import pandas as pd import requests import json import time st.title("Transaction Summarizer") # custom CSS to gray out Tinyllama st.markdown(""" """, unsafe_allow_html=True) # model selection with grayed-out option model_selection = st.radio( "Select model to use:", ["Gemma", "Tinyllama (disabled)"], index=0 ) # Determine URL based on model selection def get_base_url(): if model_selection == "Gemma": return "https://api.runpod.ai/v2/lld3iiy6fx7hcf/" elif model_selection == "Tinyllama": return "https://api.runpod.ai/v2/0wnm75vx5o77s1/" # Initialize session state for jobs list if "jobs" not in st.session_state: st.session_state.jobs = [] # Define the transaction processing function def process_transactions(transactions): base_url = get_base_url() url = base_url + "runsync" # Retrieve API key from Streamlit secrets api_key = st.secrets["api_key"] headers = { 'Content-Type': 'application/json', 'Authorization': api_key } data = { 'input': { 'transaction': transactions } } json_data = json.dumps(data) try: # Send POST request to start processing response = requests.post(url, headers=headers, data=json_data) response.raise_for_status() # Raise an error for bad status codes # Parse response to get job ID result = response.json() job_id = result['id'] # Add the job to session state and set initial status st.session_state.jobs.append({ "id": job_id, "status": "IN_QUEUE", "transactions": transactions, "result": None }) status_url = f"{base_url}status/{job_id}" # Polling the job status while True: status_response = requests.get(status_url, headers=headers) status_data = status_response.json() status = status_data.get('status', '') # Update job status in session state for job in st.session_state.jobs: if job["id"] == job_id: job["status"] = status if status == "COMPLETED": break elif status == "CANCELLED": return None time.sleep(2) # Adjust interval as needed # Once status changes, retrieve and return the result result_response = requests.get(status_url, headers=headers) result_response.raise_for_status() result_data = result_response.json().get('output') # Update job result in session state for job in st.session_state.jobs: if job["id"] == job_id: job["result"] = result_data return result_data except requests.exceptions.RequestException as e: st.error(f"An error occurred: {e}") return None # Creating tabs for different pages tab1, tab2 = st.tabs(["Submit Transactions", "Upload CSV"]) # Tab 1: Submit Transactions with tab1: st.header("Submit New Transactions") # Input for submitting new transactions new_transactions_input = st.text_area("Enter your transactions (comma-separated)", key="input_area") submit_button = st.button("Submit New Transactions", type="primary") if submit_button and new_transactions_input: # Split transactions and strip whitespace new_transactions = [i.strip() for i in new_transactions_input.split(',') if i.strip()] with st.spinner("Processing..."): # Process the transactions and display the results result_data = process_transactions(new_transactions) if result_data: st.write("Transaction Summaries:") st.write(result_data) else: st.write("The job was cancelled or encountered an error.") # Tab 2: Upload CSV with tab2: st.header("Upload a CSV File of Transactions") # File uploader for CSV files uploaded_file = st.file_uploader("Upload a CSV file of transactions", type=["csv"]) if uploaded_file is not None: # Read the uploaded CSV file try: df = pd.read_csv(uploaded_file) st.write("Uploaded Data:") st.write(df) # Process the transactions in the CSV file transactions = df['transaction'].tolist() with st.spinner("Processing..."): # Process the transactions and display the results result_data = process_transactions(transactions) if result_data: df['summary'] = result_data st.write("Summarized Data:") st.write(df) # Prepare the summarized data for download csv_buffer = io.BytesIO() df.to_csv(csv_buffer, index=False) csv_buffer.seek(0) # Download link for the summarized CSV st.download_button( label="Download Summarized CSV", data=csv_buffer, file_name="summarized_transactions.csv", mime="text/csv" ) else: st.write("The job was cancelled or encountered an error.") except Exception as e: st.error(f"An error occurred while processing the CSV file: {e}") # Reset button if st.button("Reset All Jobs"): st.session_state.jobs = []