|
from openai import AsyncOpenAI |
|
import panel as pn |
|
import httpx |
|
import os |
|
|
|
pn.extension() |
|
|
|
|
|
API_URL = "https://api.crossref.org/works" |
|
|
|
|
|
DEFAULT_PROMPT_TEMPLATE = """ |
|
Here are the papers related to {query} |
|
|
|
Help me summarize these into bullet points, readable within 2 minutes. |
|
|
|
{items} |
|
""" |
|
|
|
|
|
async def get_relevant_papers(query, rows): |
|
params = { |
|
"query.bibliographic": query, |
|
"rows": rows, |
|
} |
|
async with httpx.AsyncClient() as client: |
|
response = await client.get(API_URL, params=params) |
|
output = response.json() |
|
return output |
|
|
|
|
|
async def process_inputs(contents, user, instance): |
|
output = await get_relevant_papers(contents, rows_input.value) |
|
instance.send(pn.pane.JSON(output), respond=False, user="Sources") |
|
|
|
items = [] |
|
for item in output["message"]["items"]: |
|
abstract = item.get("abstract", "") |
|
title = item.get("title") |
|
url = item.get("URL") |
|
items.append(f"{title}({url}): {abstract}") |
|
|
|
prompt = prompt_template_input.value.format( |
|
query=contents, items=items |
|
) |
|
instance.send(f"This is the prompt I will use:\n{prompt}", respond=False) |
|
|
|
response = client.chat.completions.create( |
|
model="gpt-3.5-turbo", |
|
messages=[{"role": "user", "content": prompt}], |
|
stream=True, |
|
) |
|
message = "" |
|
async for chunk in await response: |
|
part = chunk.choices[0].delta.content |
|
if part is not None: |
|
message += part |
|
yield message |
|
|
|
|
|
client = AsyncOpenAI() |
|
|
|
|
|
prompt_template_input = pn.widgets.TextAreaInput( |
|
value=DEFAULT_PROMPT_TEMPLATE.strip(), height=500 |
|
) |
|
rows_input = pn.widgets.IntInput(name="Number of rows", value=2) |
|
chat_interface = pn.chat.ChatInterface(callback=process_inputs, callback_exception="verbose") |
|
|
|
|
|
sidebar = pn.Column(prompt_template_input, rows_input) |
|
main = pn.Column(chat_interface) |
|
pn.template.FastListTemplate( |
|
sidebar=[sidebar], |
|
main=[main], |
|
title="Elsevier Summarizer", |
|
).servable() |