Files
wehub-resource-sync 86db9aae8e
Documentation / build (push) Has been cancelled
Documentation / deploy (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:34:55 +08:00

106 lines
3.4 KiB
Python

from llmware.library import Library
from llmware.prompts import Prompt, Sources
from llmware.retrieval import Query
import streamlit as st
import os
import sys
sys.path.insert(0, os.getcwd())
from Utils import get_stored_files, get_stored_libraries
ACCOUNT_NAME = 'lecture_tool'
SUMMARIZER_MODEL = 'slim-summary-tool'
#
# Summarizes specified file in specified library.
#
# Performs a text query for the topic, which can be an empty string.
#
# Uses the SUMMARIZER_MODEL defined above to generate a summary.
#
@st.cache_data(show_spinner=False)
def summarize_file(library_name, filename, topic):
# Load in appropriate library
library = Library().load_library(library_name, account_name=ACCOUNT_NAME)
print('\nupdate: library card - ', library.get_library_card())
# Create Query object
query = Query(library)
# Load in appropriate model
summarizer_prompter = Prompt().load_model(SUMMARIZER_MODEL, temperature=0.0, sample=False)
# Access all text blocks corresponding to specified file if no topic is provided
if topic == '':
# Filter out text chunks by filename
print('\nupdate: no topic provided, summarizing entire library')
query_results = query.apply_custom_filter(query.get_whole_library(), {'file_source': filename})
# Change key in query results for compatibility with RAG call
for result in query_results:
result['text'] = result['text_search']
del result['text_search']
# Access the text blocks corresponding to the specified file and topic
else:
# Perform text query for the topic, then filter out text blocks by filename
print('\nupdate: topic provided, performing text query')
query_results = query.apply_custom_filter(query.text_query(topic), {'file_source': filename})
print('\nupdate: correct library chunks - ', query_results)
# Pass in appropriate text blocks as source to the model
sources = Sources(summarizer_prompter).package_source(query_results, aggregate_source=True)
print('\nupdate: sources - ', sources)
# Prompt the model for a summary
print('\nupdate: summarizing in process')
response = summarizer_prompter.prompt_with_source('key points', first_source_only=False, verbose=True)
print('\nupdate: response - ', response)
# Create a list of only the unique points generated by the model
key_points = []
for resp in response:
for point in resp["llm_response"]:
if point not in key_points:
if point.strip():
if not point.strip().startswith("Not Found"):
key_points.append('- ' + point)
return key_points
#
# Main block for GUI logic.
#
if __name__ == '__main__':
st.title('Summarize your lectures')
st.write('### Prompt info')
library_name = st.selectbox(
'Select the library:',
tuple(get_stored_libraries())
)
if library_name:
filename = st.selectbox(
'Select the file:',
tuple(get_stored_files(library_name))
)
topic = st.text_input('Optionally enter a topic to summarize:')
if (st.button('Summarize')):
with st.spinner('Summarizing transcript... don\'t leave this page!'):
response = summarize_file(library_name, filename, topic)
st.write('### Summary')
for point in response:
st.write(point)