From c87e80f5c1329e9339d11233c9ff764bc1118eaa Mon Sep 17 00:00:00 2001 From: zilto Date: Wed, 2 Aug 2023 16:47:16 -0400 Subject: [PATCH 1/5] implemented streamlit frontend --- .../pdf_summarizer/pdf_summarizer/frontend.py | 53 +++++++++++++++++++ .../pdf_summarizer/requirements.txt | 9 ++++ 2 files changed, 62 insertions(+) create mode 100644 examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py create mode 100644 examples/LLM_Workflows/pdf_summarizer/requirements.txt diff --git a/examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py b/examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py new file mode 100644 index 000000000..c184f01c4 --- /dev/null +++ b/examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py @@ -0,0 +1,53 @@ +import base64 +import streamlit as st + + +@st.cache_data +def pdf_to_base64(uploaded_file): + """Encode the file's bytes into a b64 string""" + return base64.b64encode(uploaded_file.getvalue()).decode("utf-8") + + +def container_pdf_viewer(uploaded_file) -> None: + """Display the PDF as an embedded b64 string in a markdown component""" + base64_pdf = pdf_to_base64(uploaded_file) + pdf_display = f'' + st.markdown(pdf_display, unsafe_allow_html=True) + + +def summarize_callback(file): + """`Summarize` button callback; handle input validation and logic""" + if file: + # response = requests.TO_FASTAPI + # st.session_state["summary"] = response.content + raise NotImplementedError + + +def app() -> None: + st.set_page_config( + page_title="PDF-Summarizer", + page_icon="📝", + layout="centered", + menu_items={"Get help": None, "Report a bug": None}, + ) + st.title("PDF-Summarizer 📝") + + col1, col2 = st.columns(2) + + with col1: + uploaded_file = st.file_uploader("Upload PDF", type=["pdf"], label_visibility="hidden") + st.button("Summarize", on_click=summarize_callback, args=(uploaded_file,), type="primary", use_container_width=True) + + if summary := st.session_state.get("summary", None): + with st.expander("Summary", expanded=False): + st.write(summary) + + st.download_button("Download", data=summary, use_container_width=True) + + with col2: + if uploaded_file: + container_pdf_viewer(uploaded_file) + + +if __name__ == "__main__": + app() diff --git a/examples/LLM_Workflows/pdf_summarizer/requirements.txt b/examples/LLM_Workflows/pdf_summarizer/requirements.txt new file mode 100644 index 000000000..1ec6f7988 --- /dev/null +++ b/examples/LLM_Workflows/pdf_summarizer/requirements.txt @@ -0,0 +1,9 @@ +fastapi +openai +pandas +pydantic +PyPDF2 +requests +sf-hamilton[visualization] +streamlit +uvicorn From 8eb18ed053c1700d28f9c3dc87edb59fcbc774c6 Mon Sep 17 00:00:00 2001 From: zilto Date: Thu, 3 Aug 2023 17:23:58 -0400 Subject: [PATCH 2/5] fixed precommits --- .../LLM_Workflows/pdf_summarizer/README.md | 26 +++ .../pdf_summarizer/backend/Dockerfile | 20 +++ .../{ => backend}/requirements.txt | 7 +- .../pdf_summarizer/backend/server.py | 60 +++++++ .../pdf_summarizer/backend/summarization.py | 166 ++++++++++++++++++ .../backend/summarization_module.png | Bin 0 -> 74806 bytes .../backend/summarize_route.png | Bin 0 -> 79031 bytes .../pdf_summarizer/docker-compose.yaml | 24 +++ .../pdf_summarizer/frontend/Dockerfile | 12 ++ .../pdf_summarizer/frontend/app.py | 94 ++++++++++ .../pdf_summarizer/frontend/requirements.txt | 2 + .../pdf_summarizer/pdf_summarizer/frontend.py | 53 ------ 12 files changed, 408 insertions(+), 56 deletions(-) create mode 100644 examples/LLM_Workflows/pdf_summarizer/README.md create mode 100644 examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile rename examples/LLM_Workflows/pdf_summarizer/{ => backend}/requirements.txt (62%) create mode 100644 examples/LLM_Workflows/pdf_summarizer/backend/server.py create mode 100644 examples/LLM_Workflows/pdf_summarizer/backend/summarization.py create mode 100644 examples/LLM_Workflows/pdf_summarizer/backend/summarization_module.png create mode 100644 examples/LLM_Workflows/pdf_summarizer/backend/summarize_route.png create mode 100644 examples/LLM_Workflows/pdf_summarizer/docker-compose.yaml create mode 100644 examples/LLM_Workflows/pdf_summarizer/frontend/Dockerfile create mode 100644 examples/LLM_Workflows/pdf_summarizer/frontend/app.py create mode 100644 examples/LLM_Workflows/pdf_summarizer/frontend/requirements.txt delete mode 100644 examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py diff --git a/examples/LLM_Workflows/pdf_summarizer/README.md b/examples/LLM_Workflows/pdf_summarizer/README.md new file mode 100644 index 000000000..716896266 --- /dev/null +++ b/examples/LLM_Workflows/pdf_summarizer/README.md @@ -0,0 +1,26 @@ +# (Yet another) LLM PDF Summarizer 📝 +Here's a extensible and production-ready PDF summarizer that you can run anywhere! The frontend uses streamlit, which communicates with a FastAPI backend powered by Hamilton. You give it a PDF file via the browser app and it returns you a text summary using the OpenAI API. If you want, you skip the browser inteface and directly access the `/summarize` endpoint with your document! Everything is containerized using Docker, so you should be able to run it where you please 🏃 + +## Why build this project? +This project shows how easy it is to production Hamilton. Its function-centric declarative approach makes the code easy to read and extend. We invite you to clone the repo and customize to your needs! We are happy to help you via [Slack](https://hamilton-opensource.slack.com/join/shared_invite/zt-1bjs72asx-wcUTgH7q7QX1igiQ5bbdcg) and are excited to see what you build 😁 + +Here are a few ideas: +- Modify the streamlit `file_uploader` to allow sending batches of files through the UI +- Add PDF parsing and preprocessing to reduce number of tokens sent to OpenAI +- Add Hamilton functions to gather metadata (file length, number of tokens, language, etc.) and return it via `SummaryResponse` +- Support other file formats; use the `@config.when()` decorator to add alternatives to the `raw_text()` function for PDFs +- Extract structured data from PDFs using open source models from the HuggingFace Hub. + + +![](./backend/summarization_module.png) +*The Hamilton execution DAG powering the backend* + + +# Setup +1. Clone this repository `git clone https://github.com/dagworks-inc/hamilton.git` +2. Move to the directory `cd hamilton/examples/LLM_Workflows/pdf_summarizer` +3. Create a `.env` (next to `README.md` and `docker-compose.yaml`) and add your OpenAI API key in such that `OPENAI_API_KEY=YOUR_API_KEY` +4. Build docker images `docker compose build` +5. Create docker containers `docker compose up -d` +6. Go to [http://localhost:8080/docs] to see if the FastAPI server is running +7. Go to [http://localhost:8081/] to view the Streamlit app diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile b/examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile new file mode 100644 index 000000000..a41e52409 --- /dev/null +++ b/examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.10-slim-bullseye + +WORKDIR /app + +# install graphviz backend +RUN apt-get update \ + && apt-get install -y --no-install-recommends graphviz \ + && apt-get autoremove -yqq --purge \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 8080:8080 + +# loads server.py module and the FastAPI `app` object +CMD uvicorn server:app --host 0.0.0.0 --port 8080 diff --git a/examples/LLM_Workflows/pdf_summarizer/requirements.txt b/examples/LLM_Workflows/pdf_summarizer/backend/requirements.txt similarity index 62% rename from examples/LLM_Workflows/pdf_summarizer/requirements.txt rename to examples/LLM_Workflows/pdf_summarizer/backend/requirements.txt index 1ec6f7988..d5aa46ca1 100644 --- a/examples/LLM_Workflows/pdf_summarizer/requirements.txt +++ b/examples/LLM_Workflows/pdf_summarizer/backend/requirements.txt @@ -1,9 +1,10 @@ fastapi openai -pandas pydantic PyPDF2 -requests +python-multipart sf-hamilton[visualization] -streamlit +tenacity +tiktoken +tqdm uvicorn diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/server.py b/examples/LLM_Workflows/pdf_summarizer/backend/server.py new file mode 100644 index 000000000..5c6fd40e5 --- /dev/null +++ b/examples/LLM_Workflows/pdf_summarizer/backend/server.py @@ -0,0 +1,60 @@ +import base64 + +import fastapi +import pydantic +import summarization + +from hamilton import base +from hamilton.experimental import h_async + +# instantiate FastAPI app +app = fastapi.FastAPI() + + +# define constants for Hamilton driver +driver_config = dict( + openai_gpt_model="gpt-3.5-turbo-0613", + file_type="pdf", +) + +# instantiate the Hamilton driver; it will power all API endpoints +dr = h_async.AsyncDriver( + driver_config, + summarization, # python module containing function logic + result_builder=base.SimplePythonGraphAdapter(base.DictResult()), +) + + +class SummarizeResponse(pydantic.BaseModel): + """Response to the /summarize endpoint""" + + summary: str + + +@app.post("/summarize") +async def summarize_pdf(pdf_file: fastapi.UploadFile) -> SummarizeResponse: + """Request `summarized_text` from Hamilton driver with `pdf_file` and `user_query`""" + results = await dr.execute( + ["summarized_text"], + inputs=dict( + pdf_source=pdf_file.file, + user_query="Can you ELI5 the paper?", + ), + ) + + return SummarizeResponse(summary=results["summarized_text"]) + + +# add to SwaggerUI the execution DAG png +# see http://localhost:8080/docs#/default/summarize_pdf_summarize_post +base64_viz = base64.b64encode(open("summarize_route.png", "rb").read()).decode("utf-8") +app.routes[ + -1 +].description = f"""

Execution DAG

""" + + +if __name__ == "__main__": + # run as a script to test server locally + import uvicorn + + uvicorn.run(app, host="0.0.0.0", port=8080) diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/summarization.py b/examples/LLM_Workflows/pdf_summarizer/backend/summarization.py new file mode 100644 index 000000000..5e9368f0c --- /dev/null +++ b/examples/LLM_Workflows/pdf_summarizer/backend/summarization.py @@ -0,0 +1,166 @@ +import concurrent +import tempfile +from typing import Generator + +import openai +import tiktoken +from PyPDF2 import PdfReader +from tenacity import retry, stop_after_attempt, wait_random_exponential +from tqdm import tqdm + +from hamilton.function_modifiers import config + + +def summarize_chunk_of_text_prompt(content_type: str = "an academic paper") -> str: + """Base prompt for summarizing chunks of text.""" + return f"Summarize this text from {content_type}. Extract any key points with reasoning.\n\nContent:" + + +def summarize_text_from_summaries_prompt(content_type: str = "an academic paper") -> str: + """Prompt for summarizing a paper from a list of summaries.""" + return f"""Write a summary collated from this collection of key points extracted from {content_type}. + The summary should highlight the core argument, conclusions and evidence, and answer the user's query. + User query: {{query}} + The summary should be structured in bulleted lists following the headings Core Argument, Evidence, and Conclusions. + Key points:\n{{results}}\nSummary:\n""" + + +@config.when(file_type="pdf") +def raw_text(pdf_source: str | bytes | tempfile.SpooledTemporaryFile) -> str: + """Takes a filepath to a PDF and returns a string of the PDF's contents + :param pdf_source: Series of filepaths to PDFs + :return: Series of strings of the PDFs' contents + """ + reader = PdfReader(pdf_source) + _pdf_text = "" + page_number = 0 + for page in reader.pages: + page_number += 1 + _pdf_text += page.extract_text() + f"\nPage Number: {page_number}" + return _pdf_text + + +def _create_chunks(text: str, n: int, tokenizer: tiktoken.Encoding) -> Generator[str, None, None]: + """Helper function. Returns successive n-sized chunks from provided text. + Split a text into smaller chunks of size n, preferably ending at the end of a sentence + :param text: + :param n: + :param tokenizer: + :return: + """ + tokens = tokenizer.encode(text) + i = 0 + while i < len(tokens): + # Find the nearest end of sentence within a range of 0.5 * n and 1.5 * n tokens + j = min(i + int(1.5 * n), len(tokens)) + while j > i + int(0.5 * n): + # Decode the tokens and check for full stop or newline + chunk = tokenizer.decode(tokens[i:j]) + if chunk.endswith(".") or chunk.endswith("\n"): + break + j -= 1 + # If no end of sentence found, use n tokens as the chunk size + if j == i + int(0.5 * n): + j = min(i + n, len(tokens)) + yield tokens[i:j] + i = j + + +def chunked_text( + raw_text: str, max_token_length: int = 1500, tokenizer_encoding: str = "cl100k_base" +) -> list[str]: + """Chunks the pdf text into smaller chunks of size max_token_length. + :param pdf_text: the Series of individual pdf texts to chunk. + :param max_token_length: the maximum length of tokens in each chunk. + :param tokenizer_encoding: the encoding to use for the tokenizer. + :return: Series of chunked pdf text. Each element is a list of chunks. + """ + tokenizer = tiktoken.get_encoding(tokenizer_encoding) + _encoded_chunks = _create_chunks(raw_text, max_token_length, tokenizer) + _decoded_chunks = [tokenizer.decode(chunk) for chunk in _encoded_chunks] + return _decoded_chunks + + +@retry(wait=wait_random_exponential(min=1, max=40), stop=stop_after_attempt(3)) +def _summarize_chunk(content: str, template_prompt: str, openai_gpt_model: str) -> str: + """This function applies a prompt to some input content. In this case it returns a summarized chunk of text. + :param content: the content to summarize. + :param template_prompt: the prompt template to use to put the content into. + :param openai_gpt_model: the openai gpt model to use. + :return: the response from the openai API. + """ + prompt = template_prompt + content + response = openai.ChatCompletion.create( + model=openai_gpt_model, messages=[{"role": "user", "content": prompt}], temperature=0 + ) + return response["choices"][0]["message"]["content"] + + +def summarized_chunks( + chunked_text: list[str], summarize_chunk_of_text_prompt: str, openai_gpt_model: str +) -> str: + """Summarizes a series of chunks of text. + Note: this takes the first result from the top_n_related_articles series and summarizes it. This is because + the top_n_related_articles series is sorted by relatedness, so the first result is the most related. + :param top_n_related_articles: series with each entry being a list of chunks of text for an article. + :param summarize_chunk_of_text_prompt: the prompt to use to summarize each chunk of text. + :param openai_gpt_model: the openai gpt model to use. + :return: a single string of each chunk of text summarized, concatenated together. + """ + _summarized_text = "" + with concurrent.futures.ThreadPoolExecutor(max_workers=len(chunked_text)) as executor: + futures = [ + executor.submit( + _summarize_chunk, chunk, summarize_chunk_of_text_prompt, openai_gpt_model + ) + for chunk in chunked_text + ] + with tqdm(total=len(chunked_text)) as pbar: + for _ in concurrent.futures.as_completed(futures): + pbar.update(1) + for future in futures: + data = future.result() + _summarized_text += data + return _summarized_text + + +def summarized_text( + user_query: str, + summarized_chunks: str, + summarize_text_from_summaries_prompt: str, + openai_gpt_model: str, +) -> str: + """Summarizes the text from the summarized chunks of the pdf. + :param user_query: the original user query. + :param summarized_chunks: a long string of chunked summaries of a file. + :param summarize_text_from_summaries_prompt: the template to use to summarize the chunks. + :param openai_gpt_model: which openai gpt model to use. + :return: the string response from the openai API. + """ + response = openai.ChatCompletion.create( + model=openai_gpt_model, + messages=[ + { + "role": "user", + "content": summarize_text_from_summaries_prompt.format( + query=user_query, results=summarized_chunks + ), + } + ], + temperature=0, + ) + return response["choices"][0]["message"]["content"] + + +if __name__ == "__main__": + # run as a script to test Hamilton's execution + import summarization + + from hamilton import base, driver + + dr = driver.Driver( + {}, + summarization, + adapter=base.SimplePythonGraphAdapter(base.DictResult()), + ) + dr.display_all_functions("summary", {"format": "png"}) diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/summarization_module.png b/examples/LLM_Workflows/pdf_summarizer/backend/summarization_module.png new file mode 100644 index 0000000000000000000000000000000000000000..9f069234e1fd38fcd04d60566417b11a30a55254 GIT binary patch literal 74806 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

d3lY2#S+&Vg>)9vlhAX0lCd#l=&F< zyZ>LpvD@+Q5%>N*qOa)YN^)h>7=|)_xp>qOyH z+=+T{0y*~A*H?HFZXFYz&qnJB$#jg9XK_M6BB(u)HYcEC3?I%- z;%~_=Zot30$i$O)s5iuZ!fgb5C1EDM=)4T$Q`h}q{hOFjM>Vbe^EKUla;=^yE|K05VwIL zwc&fia)ijV+lSIY9>f!B00Ls}=aXOpLg+W}7UBAz%e8R?W^@>ao&1;U5*-qd&&^3) zA=m$*_|)lIHYAgr0zMsG9I?!xNBLjyzrK+EJeZ0@;T7?z0=VYUqem2=KeR?kOSX%C zuvuf8{IKBWl@xr^8w?d9y({ADAe14C^h+LZ;QAM}&hp14SQ~u2yjBr47T>**=hhg= z>vfPd$?1oGj>*{ASWqvY?SD0LT3!j8T8B*qJ|ynE`g-C3f6{BrooR?m5y2IpQEb}} zvJa`R3%(t%@bC@6^`S`_2aEi{L<1oy6QHXiqJ*^9vYk`H6v0g-J)mvEMkALQgTKml zTNH=hOfI_0pZF|b6Iin+RAmevt4<8?_#zRp?%?$biBkqJ#{2=`bTc|wcn5H&j3;KF zSupow(LcpfU0sd5bQl`wt7ZCCD+qzRcP}ftc^M^T%D**OSV`6(2-U|3{!z#>+^B5K z>{twfDsayZQPB?`JV=H{&?li6<7V!$G?bC<1V&IJ@cu(qhOv8QK3ZpD3ou zt6=*K3od8_y+XdmJBP?8$jit}q#$Bc<_CxFveLh`SXLx!ad>4#NL)&v@hz~KhhV1q zUo9opdrbXA4P-RwmEwH}mj}It%+8<}>!Ug&4lX2qsz4Xg4SN`_!%#kSh_Z{@g$he@ zN^1EGvAfjNFoF{X8#P$|b79TDFHT1adIehh@phL{2x@m%2T^79aDxkeR57i=8>%Ae zwqS>^ZGh=&aPWlrgS-nFYdz%@R6*l)FyNKrHb=+y6?g?nyaG->8P5jQrS-<3*p`o* z-S}Si*|$)0KvUSwaiJKaTzB7Qk}Fc?c5CckFV*1m@4$y-k~(C+lb6>BT|7}}a9af- zfy^+rLI4{Ki=M!6ZE{;f(TPl9!-ms}wma+tvBlcU9)&8NZbgOW28<`R-{5zxV?3(3I z`XmJVVX`;%jg70I=n;MjNTUm}noCr6a%&qZ7OHz_M1&7y@bjY^=vEPEjU+m_A^_E$ zdO{A<3IB|Kkl^9`!mXos0J0UgGuuflBVm)P6$tr`yCZ$m(yR|2X_v< z{w<7M*#3Do6arjShC2j}U@so#tlL;1uM*yGcSnUEKeSE0dua zoetaw`qChv7;-U5#-Jd|ZM_Os5~xH~V)=Q2Q9+7~>ft7lz)?{;Ckp@vPWw0}8MCk2 z5TjrnB$rLq4W`3FQG91b3@PeGVR)iJ9TCLKgQk!Ea!cF`@YSYlPN=zF;j?zg^D|5p2r5E z%tKO%W|R!6%vvPLxR5DQX;4&zh)k6vRMKEbDb@SAT5CVg^FNMvKkvJbeeAW@TIjxi zzwh@N&g(qStMLu83=S9_WBOday%l`rbDH;$RdjmeOij}V?f0IE98S_MOqcp}#@&rd z#{e-?iQbB)TIaFcif(7Y?OI{;mKkE$%X##&W=9?vnwwYq`ApHDGH+h!qsntZL3Id; zg;wHr*Q^8~JDv}H?7iGotKiC7n=OC|bcZhl-=gut@HHsK? z?hHNSAavXN>E7&51r#GpVoD9j0dc9RbAo?SMWj6AgV}CMfARczXFa{h3A zlQvJtp+dqU(#G`yg}+yD?`#9u}osi-4-|Xv>1|{Xdp@^FU~KdHWEU+{7k_mqwQ?1d3lP@g#u1%WU7K;nue& zIJZ`jC2d67N+RThyrX))1DZVIm=EpmuDKX7(}wemw_Ip`=q8#9&6J^$ zv#p2ka%3G@3;&t_eX2qwsHBvIF+kvtoAZizM?iEJ?O@nECg}Vh3ik2c)WVE^kYxu5 zsl6Ep7O%;s-}F-xE*@$)V5QoHr5A1=nsEM5!~S{SOnM~0S(Wwehg%~~>{{yH-#Kftc;h(7ehzLu?eCj3d;jcOY}1gbDKB2WOlql+#kGg&Wyqf^4j*8EC=M=#8I1#{mzn0T#!LkNENG(D4S`0$SMmun_zyYnvj{f(vEAloO5j`x_&dcrDJ1a^A#b zhx3qBfCHi1(xgL+DUx)H&emF(c%9-}N+#3FnZ^khaYYu2Ggt#^#f>>AQetwS2G#mq zUA`!(O`?DTO`EQ@uR3|M3wAW~&J@1*W)E5p%zZlJSBLiPDN>uCDCjxn{V`0x%k{zqe*zm6P^=0qeW@)Q# zyf}DQBk$;`)>bQZzva!HLIGjAL#K@Ar#S#mO@030}$ zpkj^NgknWW<<;xg#n`-QaY{0YL92J~Mo>7R%^AYB0A>mcAeiAK#fyTrDdcNTZ~Erh zT!q!Wa)@csl?7G>kMR*lkTJew>~TVusFxyc`u6Z)8asUQtA&u$0mg+p!_PL(7#}d) zZdHWOu{xs|TLT2vgF%QHt%zaB%4QS4?Thk}o-qyv&<@5XhTYWc{??u35Y0Wsuuui! zPMlT zJ=1-}&;smxQ$;~&gms_sR%GpN`$Jx&q{L!~`^LE%$WoAAraOLlaKS)?r6p*(ecUiX z3fhTLB0`6EoLgZ$f%fT0LZ#&pOKZ4_-5aJIeQ|B+jst^NY8Op1F^NdExZ|$+(YI6n zx2Q2)W*i;b7=HL-!i)_XJ(JKsAH8^SGp+voE|E#J>C#S&HZ%-+WHi5>g>L_yV`BZc zo$A+#{I;0WO#36g0vOtfXQI8mCngd0R%&L@0jnn;=c^sK~(53FxcfaoaX+w!;{@!`}<-_}aCt3_j-_ZqJ3o z6Eebj(hglg36|3&fJxn>4lX8n_!q5DbQMEZnmnkyqbYOn1mYRG5eE=@Z?NArw#$qQ zGlVP}Hg|Fjb&?MyB{*}N^uZkVRT&ehKhDk3 zl`2lmlOfsuLzrc{PzzQg0S6{}8yXMZ@!8$?Tr4?UVj-t*1Kk6BGmFn9ngCp0Ou}+acxqC5FtQelek#*IMjsTqVs42vS2P1MccG4_ zpBl^b;^vyyTPfgcD~5k5nl+J(C=LRmQdnx$X7jEwU21+XBTeRQo%{6JT@i`zG^(P4 z$9>xD{tB-`>@8^*g@e6k&y>prDQ>EpaRz-4$eNg(Y()Nr|AfDnn-62a2Yb-zJkIfLY(O^U812%M&L+auVkBxS`O@ z_J_qBt~$`8l}V4b4VtJwS=RF>eqGJuk4*kHqrA6{&bsgQ$0t?w=Ddd8=_OGc-Z^nC z_{+YZZH*4*MFo)oDTrgh<(MIO;v;#2@{Kc-u5yQM2{8;A&&_etEW!0CJ<7QQJ`E6t zL7gEW)7{g${v*CL`GJTd{21db>8nQA&RQLE|V z1J#ZL3DfIjkp;wO!y0}HEauUKZz@Vic>6Xh#m<*JOj%L$_g|vKR%4A*GqSgExUn^X z>G+jWLTm8gkhl-7AacZHXnG zAygQW9|meabUV)NJ@vc3~lbhu=~|4 zdftN2bsFM+K_^eRP;AmYSpflC1Sn4A13}?yWHG1eytaL=+`s^thOIuveB0?+1YJRy zbg~>?Il*iyeLY=FfYY~z0y{>z*1 z2+?hs@!o-@FY`5?6(D%zfiYc1vw4G=RE?$PykOHU3`4{N6|8*qi@xlBksfKu)g$4% z_dWyqnZ9tLx0d1d7!(2EUh&}W=S{nv@<{^(gqA8)X}Vh=PbPP&;0brZSwu1|S=h<* z_41l8Z;UpQ0|*!6zP)zFxHp!SBt(&KG9i$$ZG;iu)O2@yh#G~;7x(UYbh7E;u6lfY zgTA+1tD_z^4Fs`)ZrLbif5MFhP20QkdY1riNJ`z_T+@5>w)!)oEs|j!`XDWrAtd57 zfa5rPEgAC-#0ax}za!dXL9ONS@G0Mc&*D8lj$AE+PygB_bn>}h86v~Y;)5#O$cFa!j zeY{T|WZ3SjqGYeDph#ChMPf_D`-OmMBaJfj!1;?`FAop`KAH3G-*YZpfrr<=-u@pd zD2-}V`4IFB32Wj-2z741zJc%k>dMS&kz>n*Sw1+RtYB>G+*>LSoMDy%?K*+v0Dhw& zp~JVhgT|KOU5&a`>!(y~W17hsr>QSaooD`4W8zuFj_>(i!ZD@bN3S6wCCUl}!;8^C znD%MI3dUJ3AsvHxT{FC$_(r!WO`Iw47m zk(UWi`W+t=daQ6=u#ii%-=x=w?6fz|u_)3L5m_CojZav#EJX##V->bFGEh=}XH}JV zd3g9js4t$SZP*{)R z$t<4qD96#lk3WlS&jLHhGES-x8H5Ii*V5w4!`gr(NJNFvl?}iyxE0I@Wg_G4F30qp z+tUbb%D)s^*6gfNph<{(;$mDIL?T9D%M4u4Oj{&MTs#dLG^vz`PvGTl_HQ>gV6G;} z35%0<3f~$iG{~}R-au$Nv?;NX{NBxba`0sOxa2C_vwq&xX%71 zV_iTuIEP<3ds+NdIyxehNE*=()Nr5&uT&GgIh1*^KnB2a^33Q($#wV2;yBTGFsH4} zbJOec`c-Dq15kSF{Gck`5p-J~nDsWtC`lR;k?%`&S7VL)A{fAQ2{^fMH5>Q8?M8eN zl$sD+^u!Vf<$gy`itjQwzrUL8_FXu(#mCLl&R?F?lzYRh=)jsajk~(r8skj-?8S>^ zs3Jc7;Z04(>xqXS^6c3&3w}4U18Y1P?7lE3vVH>kyMQcmQ zm#DKi<1Z+WEi zX!CS?I015qRa>;!!U#2s%0!MTbrSRd9|&2UVLve~bMo9pJ1c;>++yY@#o0avtl;r1 zy0T+y$;)fj6nD2ad~8Ic=P9&*B2qz%1PuiTvjJ_YqyXFtim|Z3Pi#-omGUN0(T9Amh-v-7ZeL%V@i-%v2r4+L>bN;PL0;(EJQLn-5KS>p7B!$kR1t=ja+|!Z6IEB z2!}+xD~||hH@sh)6q~&K{H}<*L*0kX@B*DvOzV`~`BeXZ^QYLSAVcana+9jGh~c)q zXvMF>prXt9s%8SvLIYPHTwYQH7Dw;8H&Y&%KoKgnkc{j}*+SG=q<5l2wJ_wM!XzNn zVENn~M&1EI4ufah6o)GAjx?a+=R*GP(zmZy(Uk+zktFtlY7KrBPcwcnDwtvuCX;Y% z@g3!HfC$S}|Iy zO>0LU`s?w9Q^`jMEpH}X3lchNNOgvl)@sUf>~S=l7?{G~OyDkw4D97XN5&XUojlL9 zlB_b7A1&|}UpMf1$!}rrQ@V753?~#ZE|{1Qa6Jx$zdbHX_hgJfrFnwB8sgN$qeGih zm44VaP`Zql3)UwkG=@JGH)SY{jWY%rSuXVOxG2{K(hm;Gq`8%4AgJ(AJ<{~I7Bd;z zQIGx&6wJ4Te=fO?B|%_kAeUn1y|h!#CI|n#ygXrD1IpZ5315Ge{is@){LJ+~Hp!gM z6mo%9>026lQTB?y9B2u_?-l$rbbKD_sO>DqFWZ89A$oJR%3v<+&EmR{*C)?Ym#}nB z7U6-aDB!Qscy6e6eVeQ|VnjsT$I#^{moEMEAGvK&NP2S$#q<*$&_=ImeIaDc-e&6A zfbQq*#*cX7^1EyxESs=l0iFCp1_fO8@$q?hlXTKiA@fteJQ_X!g;vX#9Nt*voE_g3 zHn0+OnkJ7W2)+4@CIuI~y?1ga??)B|l-@dIKcdyuA_sAD61y4%fWl(f)w&O+!_U`V z(g>yFhGEGPJkvAj?+jhF`+WQ}n(j)A<0jLe)YN-8(yagZpmo^K^RumVIvf=D2SlNN z3|aGP)V967cHBZQ+wSzS&#TNL`b@iaqi-l7a{$>B zx#9f-&4nD=->%-+h0zNC3Z0M}=EG+l?^AAk>Z~rin$Q~x3#%jksd-`b-WI2MbkmA_ z#svNj{n-K=o9i!d#HOz& zA3D-~zQ#q%q@M+*#%n-IE}fY)BHf%SA_84L^Pt6G&`lKL@_rP;-K5ErE$P?SklmXo zDiRE;0uOvd?ysv@!-W75_d-^CjUc=i)A?&?lTKvVP4(0DFuT2JuO6a@dkG1HfJ^2Y z8~6Tx{7{`nNX)NsH2s#YO~19*By={>q66A?9HJKCp0|Xb)EDXg6#fLs3vhLY=wJHT zx=kBh-kBJ6(cUkh3S@G(1m~+IidRS+GgqZaE~18&As`%8*bi z_5DSIpu-J$mYTYhqV?jLGusEo&qoQ@0pFSmY>z)0TP@!VjLP)mQ$fKa=cxquMdJL+ zvHn6^?z_4Ay7$iD!it=JnjbQnjr|f4)fw+JlDXSvN5|`|OgJ5k)$}eJf~$D2_p;OT zf2#Rl;^qg(>463zid+UbAiM$EWPHTcj-p_*S-(E_Tjx5FVQXd&1_Xrndk2*Uy#1GX zE1nz)?r5-U*t`(?kp}q@Lm}3P>3{IT$nu8;hf1A#C*QnpQhi{#f&Go(epVV6FKy@} z4?IBMpX+dA!Md+A=1m`?XLP)1>+O$Ww=+H74p}kTQL2$+4r4HqnY#Tk15hJOhxZOJW(~ z@FREQ%d|sK!Urfs5q7C+D4@-d{wH}{OW&5l@*JozRnGbQLO{i{B=g&wtdAyHE!e{J zV>xxRB{^r^;dQ#>OXHrkJqdV-C*fZhpdkf2IrnPsu36ee%R5p_&6!N?>WFd8YlG@v z)52b+E#Un(QE(v+_#HoR;I3i-Trt1AB>fb&y zU$*2=qJVF?bIe4uY0H0jUYmLRnvr%ZUBwsrX5FGk$;r#fI};}i`}yPAjCL-SCG)UJ ze$;)+!H;JHT$WJW&HX$)eAaR`?{774)%K69VVEv019?B+;la1#(>}f)vf0OA^G}<3 z`ES0xxbvn@D1{KVcT*!8CKLwu(LQ;+YqI_5x8F?P7Aej7DNBEh|3k~{9Ue;RH zp5{24jHK&hZjb~Kx|V`nCF@F}#aU|;%d(88XpY!;@nL34t-Zs`n|%2C<6FU(FT+h; zxT*|lo6|u2Mmomubibp2O636iLQ}syo+y!BK-9;`^-4EHDBmW}*KQ>qn{8!sOryw9 zl?G5eVazuNrhJWfm*OjBCP~fWD>-$0`Q9zL!or8uy>F{9O*rT}n^J9v6qFiqt zcY%$MQh)czgysP`yQEcvI!#0F^2sq`gMPu6n|3#Fnh!CFv>Tr8eZ)rlQEluEsA{URU1tPsY=#fyDOi?M** z(7fMIUB3(Rc<1k-6zww42@2{u$ZX1#OL4p3<}8>>H^qx+0AK+?W>fjMSa2!aC>n;m zWD`W%*Z3RaIY1fi>F=+>bL=swizT=;ffE3O3Gl1Gn+F38D8&DD#0{OiZwz1AvzD2s zPHD8XYVI884S&s?{XQ%2TcK5`EKqXU^;YyrzcGGb!+avz06J!An=o=~NtO zaNyv#1A2S}*|NuQ(>~~8_q?w`<0DTKK3BGzvtYsb=OtKaFrS!vK0kNmhd*5$;=)c| z$a(g7P1^V81|zNqL>Rw3lyLn)KMRZOjX59lzZb3gPl!Bud8|W_xEnbB{E{`IiN|NN z<>QnNz7VH6^Q^c(jm!#x_l2T=dY-~jmumshQ6NeFAB+)&MH861ccZH-t^7(Ux=w;* zrRpBo9Qe032{w*WT1bZJAVz@LUIWGSOmX6guHU^Df) z($j2Rh{F{2m(0qi-Et2M)S?|u`?98dvt2@tj;e|v%HmlkfDy1ig3=Gh@z;MEg5|>w zSl1d0xq>aH!^_)MLk$v>X;04vA|j;PH3}|yFsYl`jb9mu=Z23sy8fL-W@xwMjoPa+ zOIiyNh}b{VMALY|02ws0d@Qg6cRw4`xk!7}SB zPWwDA{PgL?r_Nd*8g72v`dg>uUFC&#B~EYr*3Po6{Jt_{#!HvEVW~4xu7swx{_smD z(d2laiijuAP=^aHS6~w~XO>(B*3!DO`cv-1laEl+A{Z+}_*vWLaivtFAT$bvT*dF- zv&YRFVfXpKL&r-OFEW|$Kj;!gD`qemZLH=2s$*9qYc-2*e{aSGytT{yq|u7jyYC?~ z69X@?G zQB}!haEXOECBPUBaK$BJa3wR&`3x=cfnfinUjfz5vHh}!-9;+B9nc~N3^<8 zRKAs#q8(`^o~L%{c?mmiTGLw=^w=3bOX}TTj;DMMP13x#pA_4IPCugKa;yFwTKB_0 zgqB7_zwo?@G>VjA)~rQ59eg%)Uyi9((btQKMGNOWKI@+`Wb8|W)8W^HGZu#NZrllW zH%6FSUF?(i-OM+1*{|alBAi%Uc&mQp=oVFCr%9Co478KAsn=-;+o-E2 z(#;P4qFSBz_yj}B`-D5=NLK)@$$-wilKgPdt`if*?rv(+2SAjsX^oFCm#h;5R6gRy zY#$ZM!P09Rjpu0+|p1cJkBfsPg9_Q9v;cw?*w-_WB_$J9;w}5 zs)SGT`2_Q)`=GxviLt|5uU-yXxVs&NGaf;0+O|!goIvEd)a!m}JHEt7(5IDdTEzBxO;aGtmyW$dc=P7lOu0UhxC5K5b6jn zFlkp78-`x&udTg9Dp-K^bqfM??Up@J-|VgV&rMD)FVsucPE8&j@ZkE|Z!Zi!zD|B{ zZguGCOB?bzscRT8%j&3tX6>J4&BQ&koJ@dY@ZRAH9eXIs1zFB`AuIfbh) zy>%1vgJ(#{;2P8A(OE>1$IEyOmZ0QctXwNPBqb%yDjV+bH*Ci1&=$8f)fj#tFE@7p zxm&zw#Ui?!+RlfLv=XmYUyh8YmpOt{(f6-k7fS`tw_B!ASKP!KM=YERt@84vdWc{| za3PO6raO}64HxoI56yeELEYkFNXUW6ukjsZKMT2X5bydXa+05fPn#kQJqO#P`A+37 zPpNNADqYcDd;xt}`#9}e_bJ14l?2N0?1c?=NzcqN}SMFXTZbbv~N3;O3eIhfB8+ z`Hy07K~v=98KC7h)l4OXAwWE6`CT|Ze&lg+yM90)Qt$6WJ{jn)c%LamfZYE)%9rTaHWB!g%$MiJu7MnF9qEFC7#w z0L)aVkC8SZJHPver>+ zC`N>ZkKHBr1-j$V0jr+ZSk@W*E;bDHTEmpUT^ng%9pH6_P%=-ERmg}7#xeTFo%&6| z{c(yimTKcXutQV=sMbFJENPiyhOPcr{`q^?>QYzn7g;xDNbPC$M=l_Tb?-1C02Hh) zcaoQSe{wQLZ1`_d^u*7yJau*h23TNaGMg@WZP|4cZ1LkJsM3Wdyk+PCm@sw3(iH`| zc&LieB-hcC-UJ8lVuCjYm9tjn_jFfPhM$CN!Sxs+s2OZhktPC52ti#4C3rGvJ0D2* zmI*sf0rOePAukZej?-Rkrl9D#L!_C1B~}_Hlwo^fgVtg7;SM{!~s~w zDE}H1-sVz@vI>X%lx(fa{kwKO7-asBx8Ldf$CXcxmTq3YaRs<=0Zt&z2Ttg3zD-oRqUG>gHPi zeiqF9TTp89;Y7BKHcv!aSy%+|qT+B$G&ys!w8g<~di%$8!F1^Th$e4mXnMPA#}Fs4 z;(9)k=_7L8jHs$lpO(p>7EH?!F(FlfSW?lbFk*|tqJ@bjkbBUVF`C2vJ4u zQ=dVD;*0P13|ItV6tk8X+V`xYA|J5z#Wcq3(fLQh{RAo{TO{^~e-Si6{%+pqS-z3A z7|qRa<6EE}%7UEprNxv_tgIFnZ&aQj1*cH$obr+5|#q)Sy9wsJJd4 z{Dc6&f?ctD!QeNBEBf?;w-MfJv>)#P1Q`=6ISafou|Jfax<-$v3rV*HGdRMtDXVlT zFT|2puyf4CE!Z;bcWD7h*7rziTE=D0nVsg#TpNA z%o7a?{WkljUuECiA|w#ZpJf;>cbP#`;T%*j{Ku=qQ16H>FjZ1}R&-X|eNQC%`W0UW zefaoM3r`RkcJtAHHQS@wj?MxL;5bWH*NF%;P^%hWP`zt2?%Wb;$?j)NOvN>0%DV zzw0WSoI8!Ag<~WH;Vyv+s>buT!;mKOC1r%W7@Lt9vfdZFjtx1rR_?ospiHp{NY1~p zuu&Kj1ArLLxlwIf=Pj)ot+TKgZ?VjP2PBpWeZjklDZGvHtMtg(!gpuS;B;thm~PNj zRJ&n^k{M_h0qa0kKcls(5vq4oj@Rrw<)Gbj)f`5}a%%~)5q&N$^q_Xqe!}EY0ouPX zZJr^`B-qWZLw!?rPh063N;AXB^1zjoX<^u5{;KzvXs~e9YRSH16k%KBgTO5iD@lq( za0kWJ`AwLwKtQ~oZuzaa_?=zdyyLk)R>c%ihF$i?;1-9*HI|DP765Oc#zyB3vpNVR|C^=J znR|o;u%P9od%u(s@GPATNFJ7!AcJ3hkgPRY+O^R|1p(P2UgUJWW1s)#PJG#$jOdvG5ux=Ji;c-8Z-2i>f!dn4$70&DDJp!`^ zVQ7Gs?U~eG+}RXY*sa4NnteGc*f2d};_AiVOlWU_%k>A823%9I@cw^NTngM~Wl(6UYdN zB^5KG6UXRqA!VBRzxiu&(O9O5N>-#`l%KzvU7sh+PUuNcM<8UsEUXYaIF1rH4ioqp zkq3PBxjgNcT)h<+o(wo8M3NiZe-;;?IJ&)&$Q)aJLA014@QFM$Mn6uTaYunbBz1sj z3yu6=r2&osG*Cizq!d!Xf`B~k0jw;htiqFoqQ?+RNaYq5!fwUmqWJb4jEFXgfJH}V z9Cv@$u3b3d#vSxSZ6L0(AdIChM2z5LA#l=B-yp;xsHs5e`aI9q2tC6v+$adWk_DNh zv3OGy^}r8t#I1jPE4t}T=3e1n{T21NOk%}?l0TS7BCZuAmpYWdW^x!0%8m{An#r2T-``)bgWeHJd-FTBlE+{eB5>&cWn_NGc53ix+ut-S-~|xq5XA z*u^xHv6$Il>2wnQDMJY1bqJo!yy zRW!MJ+m9c%GOfcQ1jJhS&eW1snvSKN+RpK>ZvOj^^rAY68ns5(E9$(g_C)OychP4GCKoZ?6~- zkf~Yu_;tHQw;CR+^)@-dqEnOQIyrg+a()gENX{{3(*cEuvAGE)Ehk{r=81{gjsSLF zDeP-2AYD_J4uEneuM`?m42u%ZPYQ9WLLGPK4`bhXxWm2$DUt}lA5*r!N5-@R!-fwR8*FlRZD*x!3XgO>GF)eTyP{v<6Ais%N`!tf?#=gx%0t^ ztVevFQ@sqnh3~}EOq62|^qTeV{rlS7c5&jy&5B~}?D665KTe`n5cf-}f`2(a)T&a% zQwz+$xu%^yZONs}m(QIW#lObfV*u-FW?Vehq;5TLcQ5gak;yE|52_lq@MG4~PS2zO zIb)=~VBWk0&ssc$-_9k$I~8nD6HX~b*`2p+BpEe+j+dhA`7?XR5S6rY@2{0;tZw?~ca~)7@)~&3)feT*9Jg zDN8{#C;ow#cQ>`gpP!$1Qh^dOS-4?Df*)onGmw=ji7hNY@}{jWuElmNJw*-mie(Md z9cE(5t?fu75{ zSY*mEFfnPYIP#~>nHM=4n0LVUtEZShf4=@lj4gPX!vhqL)-??3iu8ExsR)zuP7 z4zDWl;lozpxS*iX(Cl)~vr+o?y^TBGa=Ui*>WrYIt_jc{ySja;x?VAuWCC`|A6qCt%`j2ot1%adW0^iO=LKq?9zXzk*P zs5_9Ve!ckHbj9SXE>A`N0+CT~>KZUCk=BbA)!6v27cU3JKY8fB$`o{4LN+o~b|2R+V$+%Wy>qB~o)@?bX-z&ksYaYk4}X zALzS2h$(tPvs1%ql=moR_H7dfAXuFNq701MKKbfDvGgCQhsbh7+7lalGWmLryULcv zUp{X5)7Zr1>5CWj{U+DKQI)5K-^KDw=9*oYC|Eu1$D1rC;5#=Zc0su2Gt+%XT$M^9Hgf z!7Zt!pfGutm9+&}Gmbp~By}g1FNK9uGfv+34Y_%f2ji`&vm=7-V!K4qWNdCvAuJ~! z(F`vYkGIrYESr_x(l0kn0hzvWsE5KO`qgVXNv(qug@}26_TSb_?%N}2I$csCi&B_v z!;@+b(Vj50D&)D{#*N$k{WG*(x}2O;6B_H`bjX8)?XNtntP2WuFZ5zco0IE@mdrJw z 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 bUmxd;Ez>N$dwJUn`L)HUiDuy=?6>}3T4fk( literal 0 HcmV?d00001 diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/summarize_route.png b/examples/LLM_Workflows/pdf_summarizer/backend/summarize_route.png new file mode 100644 index 0000000000000000000000000000000000000000..5ecaa363573abf56f4b1f7790e39c5b6e974ffa1 GIT binary patch literal 79031 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 str: + """Display the PDF as an embedded b64 string in a markdown component""" + base64_pdf = base64.b64encode(uploaded_file.getvalue()).decode("utf-8") + return f'' + + +def post_pdf(uploaded_file: UploadedFile) -> requests.Response: + """POST request to `http://fastapi_server` which exists in the Docker stack""" + server_url = "http://fastapi_server:8080/summarize" + files = {"pdf_file": uploaded_file} + response = requests.post(server_url, files=files) + return response + + +def set_output_filename_state(filename: str) -> None: + """Set the output filename in the streamlit state""" + filename = Path(filename) + st.session_state["ouput_filename"] = f"summary_{filename.stem}.txt" + + +def set_summary_state(summary: str) -> None: + """Set the summary in the streamlit state""" + st.session_state["summary"] = summary + + +def summarize_callback(uploaded_file: UploadedFile) -> None: + """`Summarize` button callback; handle input validation and logic""" + # is None when button is pressed without any file selected + if uploaded_file is None: + return + + response = post_pdf(uploaded_file) + if response.status_code != requests.codes.ok: + # this will display the status code in the `Summary` UI + set_summary_state(f"Requests error. Receive status code: {response.status_code}") + return + + # parse FastAPI response as JSON and set streamlit state + content = response.json() + set_output_filename_state(uploaded_file.name) + set_summary_state(content["summary"]) + + +def app() -> None: + """Streamlit entrypoint for PDF Summarize frontend""" + st.set_page_config( + page_title="PDF-Summarizer", + page_icon="📝", + layout="centered", + menu_items={"Get help": None, "Report a bug": None}, + ) + st.title("PDF-Summarizer 📝") + + col1, col2 = st.columns(2) + + with col1: + uploaded_file = st.file_uploader("Upload PDF", type=["pdf"], label_visibility="hidden") + st.button( + "Summarize", + on_click=summarize_callback, + args=(uploaded_file,), + type="primary", + use_container_width=True, + ) + + # could be a successful requests or status code + if summary := st.session_state.get("summary", None): + with st.expander("Summary", expanded=False): + st.write(summary) + + # is True only after a successful request + if output_name := st.session_state.get("ouput_filename", None): + st.download_button( + "Download Summary", data=summary, file_name=output_name, use_container_width=True + ) + + with col2: + if uploaded_file: + pdf_display = pdf_to_base64(uploaded_file) + st.markdown(pdf_display, unsafe_allow_html=True) + + +if __name__ == "__main__": + # run as a script to test streamlit app locally + app() diff --git a/examples/LLM_Workflows/pdf_summarizer/frontend/requirements.txt b/examples/LLM_Workflows/pdf_summarizer/frontend/requirements.txt new file mode 100644 index 000000000..0805f6fda --- /dev/null +++ b/examples/LLM_Workflows/pdf_summarizer/frontend/requirements.txt @@ -0,0 +1,2 @@ +requests +streamlit diff --git a/examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py b/examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py deleted file mode 100644 index c184f01c4..000000000 --- a/examples/LLM_Workflows/pdf_summarizer/pdf_summarizer/frontend.py +++ /dev/null @@ -1,53 +0,0 @@ -import base64 -import streamlit as st - - -@st.cache_data -def pdf_to_base64(uploaded_file): - """Encode the file's bytes into a b64 string""" - return base64.b64encode(uploaded_file.getvalue()).decode("utf-8") - - -def container_pdf_viewer(uploaded_file) -> None: - """Display the PDF as an embedded b64 string in a markdown component""" - base64_pdf = pdf_to_base64(uploaded_file) - pdf_display = f'' - st.markdown(pdf_display, unsafe_allow_html=True) - - -def summarize_callback(file): - """`Summarize` button callback; handle input validation and logic""" - if file: - # response = requests.TO_FASTAPI - # st.session_state["summary"] = response.content - raise NotImplementedError - - -def app() -> None: - st.set_page_config( - page_title="PDF-Summarizer", - page_icon="📝", - layout="centered", - menu_items={"Get help": None, "Report a bug": None}, - ) - st.title("PDF-Summarizer 📝") - - col1, col2 = st.columns(2) - - with col1: - uploaded_file = st.file_uploader("Upload PDF", type=["pdf"], label_visibility="hidden") - st.button("Summarize", on_click=summarize_callback, args=(uploaded_file,), type="primary", use_container_width=True) - - if summary := st.session_state.get("summary", None): - with st.expander("Summary", expanded=False): - st.write(summary) - - st.download_button("Download", data=summary, use_container_width=True) - - with col2: - if uploaded_file: - container_pdf_viewer(uploaded_file) - - -if __name__ == "__main__": - app() From 28005016eb07d3b86ad0fa30b34ff9fd49f0405b Mon Sep 17 00:00:00 2001 From: zilto Date: Thu, 3 Aug 2023 20:33:48 -0400 Subject: [PATCH 3/5] created sync endpoint; exposed more config to user --- .../pdf_summarizer/backend/server.py | 48 ++++++++++-- .../pdf_summarizer/frontend/app.py | 74 +++++++++++++------ 2 files changed, 92 insertions(+), 30 deletions(-) diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/server.py b/examples/LLM_Workflows/pdf_summarizer/backend/server.py index 5c6fd40e5..44f2bff15 100644 --- a/examples/LLM_Workflows/pdf_summarizer/backend/server.py +++ b/examples/LLM_Workflows/pdf_summarizer/backend/server.py @@ -4,7 +4,7 @@ import pydantic import summarization -from hamilton import base +from hamilton import base, driver from hamilton.experimental import h_async # instantiate FastAPI app @@ -13,15 +13,21 @@ # define constants for Hamilton driver driver_config = dict( - openai_gpt_model="gpt-3.5-turbo-0613", file_type="pdf", ) # instantiate the Hamilton driver; it will power all API endpoints -dr = h_async.AsyncDriver( +# async driver for use with async functions +async_dr = h_async.AsyncDriver( driver_config, summarization, # python module containing function logic - result_builder=base.SimplePythonGraphAdapter(base.DictResult()), + result_builder=base.DictResult(), +) +# sync driver for use with regular functions +sync_dr = driver.Driver( + driver_config, + summarization, # python module containing function logic + adapter=base.SimplePythonGraphAdapter(base.DictResult()), ) @@ -32,13 +38,41 @@ class SummarizeResponse(pydantic.BaseModel): @app.post("/summarize") -async def summarize_pdf(pdf_file: fastapi.UploadFile) -> SummarizeResponse: +async def summarize_pdf( + pdf_file: fastapi.UploadFile, + openai_gpt_model: str = "gpt-3.5-turbo-0613", + content_type: str = "Scientific article", + user_query: str = "Can you ELI5 the paper?", +) -> SummarizeResponse: + """Request `summarized_text` from Hamilton driver with `pdf_file` and `user_query`""" + results = await async_dr.execute( + ["summarized_text"], + inputs=dict( + pdf_source=pdf_file.file, + openai_gpt_model=openai_gpt_model, + content_type=content_type, + user_query=user_query, + ), + ) + + return SummarizeResponse(summary=results["summarized_text"]) + + +@app.post("/summarize_sync") +def summarize_pdf_sync( + pdf_file: fastapi.UploadFile, + openai_gpt_model: str = "gpt-3.5-turbo-0613", + content_type: str = "Scientific article", + user_query: str = "Can you ELI5 the paper?", +) -> SummarizeResponse: """Request `summarized_text` from Hamilton driver with `pdf_file` and `user_query`""" - results = await dr.execute( + results = sync_dr.execute( ["summarized_text"], inputs=dict( pdf_source=pdf_file.file, - user_query="Can you ELI5 the paper?", + openai_gpt_model=openai_gpt_model, + content_type=content_type, + user_query=user_query, ), ) diff --git a/examples/LLM_Workflows/pdf_summarizer/frontend/app.py b/examples/LLM_Workflows/pdf_summarizer/frontend/app.py index 8965801c2..c27563f2e 100644 --- a/examples/LLM_Workflows/pdf_summarizer/frontend/app.py +++ b/examples/LLM_Workflows/pdf_summarizer/frontend/app.py @@ -10,14 +10,27 @@ def pdf_to_base64(uploaded_file: UploadedFile) -> str: """Display the PDF as an embedded b64 string in a markdown component""" base64_pdf = base64.b64encode(uploaded_file.getvalue()).decode("utf-8") - return f'' + return f'' -def post_pdf(uploaded_file: UploadedFile) -> requests.Response: +def post_pdf( + uploaded_file: UploadedFile, + openai_gpt_model: str, + content_type: str, + user_query: str, +) -> requests.Response: """POST request to `http://fastapi_server` which exists in the Docker stack""" - server_url = "http://fastapi_server:8080/summarize" + server_url = "http://fastapi_server:8080/summarize_sync" files = {"pdf_file": uploaded_file} - response = requests.post(server_url, files=files) + response = requests.post( + server_url, + files=files, + json=dict( + openai_gpt_model=openai_gpt_model, + content_type=content_type, + user_query=user_query, + ), + ) return response @@ -32,13 +45,18 @@ def set_summary_state(summary: str) -> None: st.session_state["summary"] = summary -def summarize_callback(uploaded_file: UploadedFile) -> None: +def summarize_callback( + uploaded_file: UploadedFile, + openai_gpt_model: str, + content_type: str, + user_query: str, +) -> None: """`Summarize` button callback; handle input validation and logic""" # is None when button is pressed without any file selected if uploaded_file is None: return - response = post_pdf(uploaded_file) + response = post_pdf(uploaded_file, openai_gpt_model, content_type, user_query) if response.status_code != requests.codes.ok: # this will display the status code in the `Summary` UI set_summary_state(f"Requests error. Receive status code: {response.status_code}") @@ -60,33 +78,43 @@ def app() -> None: ) st.title("PDF-Summarizer 📝") - col1, col2 = st.columns(2) - - with col1: + with st.sidebar: uploaded_file = st.file_uploader("Upload PDF", type=["pdf"], label_visibility="hidden") - st.button( + form = st.form(key="user_input") + model = form.selectbox( + "OpenAI Model", + options=( + "gpt-3.5-turbo", "gpt-3.5-turbo-0613", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-16k-0613", + "gpt-4", "gpt-4-0613", "gpt-4-32k", "gpt-4-32k-0613", + ), + help="[Learn more about models](https://platform.openai.com/docs/models)" + ) + content_type = form.text_input("Content type", value="Scientifc article") + prompt = form.text_input("Prompt", value="Can you ELI5 the paper?") + + form.form_submit_button( "Summarize", on_click=summarize_callback, - args=(uploaded_file,), - type="primary", - use_container_width=True, + args=(uploaded_file, model, content_type, prompt) ) - # could be a successful requests or status code - if summary := st.session_state.get("summary", None): - with st.expander("Summary", expanded=False): - st.write(summary) - - # is True only after a successful request + # is True only after a successful request if output_name := st.session_state.get("ouput_filename", None): + summary = st.session_state.get("summary", None) st.download_button( "Download Summary", data=summary, file_name=output_name, use_container_width=True ) - with col2: - if uploaded_file: - pdf_display = pdf_to_base64(uploaded_file) - st.markdown(pdf_display, unsafe_allow_html=True) + #with col1: + # could be a successful requests or status code + if summary := st.session_state.get("summary", None): + with st.expander("Summary", expanded=True): + st.write(summary) + + + if uploaded_file: + pdf_display = pdf_to_base64(uploaded_file) + st.markdown(pdf_display, unsafe_allow_html=True) if __name__ == "__main__": From d44c588744cfee70fb48d1cf9a05b68b13873c28 Mon Sep 17 00:00:00 2001 From: zilto Date: Thu, 3 Aug 2023 20:36:51 -0400 Subject: [PATCH 4/5] fixed README typos and precommits --- .../LLM_Workflows/pdf_summarizer/README.md | 4 ++-- .../pdf_summarizer/frontend/app.py | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/examples/LLM_Workflows/pdf_summarizer/README.md b/examples/LLM_Workflows/pdf_summarizer/README.md index 716896266..2f1be2fba 100644 --- a/examples/LLM_Workflows/pdf_summarizer/README.md +++ b/examples/LLM_Workflows/pdf_summarizer/README.md @@ -1,8 +1,8 @@ # (Yet another) LLM PDF Summarizer 📝 -Here's a extensible and production-ready PDF summarizer that you can run anywhere! The frontend uses streamlit, which communicates with a FastAPI backend powered by Hamilton. You give it a PDF file via the browser app and it returns you a text summary using the OpenAI API. If you want, you skip the browser inteface and directly access the `/summarize` endpoint with your document! Everything is containerized using Docker, so you should be able to run it where you please 🏃 +Here's an extensible and production-ready PDF summarizer that you can run anywhere! The frontend uses streamlit, which communicates with a FastAPI backend powered by Hamilton. You give it a PDF file via the browser app and it returns you a text summary using the OpenAI API. If you want, you skip the browser inteface and directly access the `/summarize` endpoint with your document! Everything is containerized using Docker, so you should be able to run it where you please 🏃. ## Why build this project? -This project shows how easy it is to production Hamilton. Its function-centric declarative approach makes the code easy to read and extend. We invite you to clone the repo and customize to your needs! We are happy to help you via [Slack](https://hamilton-opensource.slack.com/join/shared_invite/zt-1bjs72asx-wcUTgH7q7QX1igiQ5bbdcg) and are excited to see what you build 😁 +This project shows how easy it is to productionize Hamilton. Its function-centric declarative approach makes the code easy to read and extend. We invite you to clone the repo and customize to your needs! We are happy to help you via [Slack](https://hamilton-opensource.slack.com/join/shared_invite/zt-1bjs72asx-wcUTgH7q7QX1igiQ5bbdcg) and are excited to see what you build 😁 Here are a few ideas: - Modify the streamlit `file_uploader` to allow sending batches of files through the UI diff --git a/examples/LLM_Workflows/pdf_summarizer/frontend/app.py b/examples/LLM_Workflows/pdf_summarizer/frontend/app.py index c27563f2e..9b232cc28 100644 --- a/examples/LLM_Workflows/pdf_summarizer/frontend/app.py +++ b/examples/LLM_Workflows/pdf_summarizer/frontend/app.py @@ -82,12 +82,18 @@ def app() -> None: uploaded_file = st.file_uploader("Upload PDF", type=["pdf"], label_visibility="hidden") form = st.form(key="user_input") model = form.selectbox( - "OpenAI Model", + "OpenAI Model", options=( - "gpt-3.5-turbo", "gpt-3.5-turbo-0613", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-16k-0613", - "gpt-4", "gpt-4-0613", "gpt-4-32k", "gpt-4-32k-0613", + "gpt-3.5-turbo", + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo-16k", + "gpt-3.5-turbo-16k-0613", + "gpt-4", + "gpt-4-0613", + "gpt-4-32k", + "gpt-4-32k-0613", ), - help="[Learn more about models](https://platform.openai.com/docs/models)" + help="[Learn more about models](https://platform.openai.com/docs/models)", ) content_type = form.text_input("Content type", value="Scientifc article") prompt = form.text_input("Prompt", value="Can you ELI5 the paper?") @@ -95,23 +101,22 @@ def app() -> None: form.form_submit_button( "Summarize", on_click=summarize_callback, - args=(uploaded_file, model, content_type, prompt) + args=(uploaded_file, model, content_type, prompt), ) - # is True only after a successful request + # is True only after a successful request if output_name := st.session_state.get("ouput_filename", None): summary = st.session_state.get("summary", None) st.download_button( "Download Summary", data=summary, file_name=output_name, use_container_width=True ) - #with col1: + # with col1: # could be a successful requests or status code if summary := st.session_state.get("summary", None): with st.expander("Summary", expanded=True): st.write(summary) - if uploaded_file: pdf_display = pdf_to_base64(uploaded_file) st.markdown(pdf_display, unsafe_allow_html=True) From 8e6004e06fc44e038a9006e316c5ab03f397b151 Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Thu, 3 Aug 2023 21:31:47 -0700 Subject: [PATCH 5/5] Fixes h_cache sphinx docs error Whitespace wasn't being adhered to. --- hamilton/experimental/h_cache.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hamilton/experimental/h_cache.py b/hamilton/experimental/h_cache.py index b9e127c82..c31dd1122 100644 --- a/hamilton/experimental/h_cache.py +++ b/hamilton/experimental/h_cache.py @@ -207,6 +207,7 @@ def read_json_dict(data: T, filepath: str) -> T: First, let's define some nodes in `nodes.py`: .. code-block:: python + import pandas as pd from hamilton.function_modifiers import tag @@ -305,10 +306,12 @@ def execute_node(self, node: Node, kwargs: Dict[str, Any]) -> Any: """Executes nodes conditionally according to caching rules. This node is executed if at least one of these is true: + * no cache is present, * it is explicitly forced by passing it to the adapter in ``force_compute``, * at least one of its upstream nodes that had a @cache annotation was computed, either due to lack of cache or being explicitly forced. + """ cache_format = node.tags.get("cache") implicitly_forced = any(dep.name in self.computed_nodes for dep in node.dependencies)