import gradio as gr
from datetime import datetime
import concurrent.futures
from io import StringIO
import requests
from urllib.parse import urlparse
import time
import demo as du
endpoint_url = "https://d34hcsxnegbpcslxzqsmesvr7m0ljtuz.lambda-url.us-west-2.on.aws/"
executor = concurrent.futures.ThreadPoolExecutor(max_workers=10)
def output_credit_dist_nollm(msg, cur_idx, _out_credit, _out_claims):
print(f'Start output_credit_dist at {datetime.now()}.')
start_time = time.perf_counter()
print(f'Target is ```{msg}```')
_out_credit.truncate(0)
_out_credit.seek(0)
_out_claims.truncate(0)
_out_claims.seek(0)
print(du.style2_str, file=_out_credit)
print(du.style2_str, file=_out_claims)
atoms_l, atom_topkmatches_l, credit_l = [], [], []
if len(msg) > 10:
params = { "msg": msg, "max_workers": 10 }
response = requests.get(endpoint_url, json=params).json()
atoms_l = response['atoms_l']
atom_topkmatches_l = response['atom_topkmatches_l']
# atomidx_w_single_url_aggmatch_l = response['atomidx_w_single_url_aggmatch_l']
atom_support_l = response['atom_support_l']
credit_dist = response['credit_dist']
if atoms_l:
(
url_to_cid_to_ctext_map,
url_to_cid_to_ctext_formatted_map,
url_to_cid_to_nquotes_map,
) = du.create_url_to_cid_to_ctext_formatted_map(atom_support_l)
url_to_title = {}
for atom_topkmatches in atom_topkmatches_l:
for match in atom_topkmatches:
url_to_title[match['metadata']['url']] = match['metadata']['title']
credit_l = [(url, w) for url, w in credit_dist.items()]
credit_l = sorted(credit_l, key=lambda x: x[1], reverse=True)
du.print_w_time_elapsed('Computed credit_l', start_time)
if not atom_topkmatches_l:
print(f"
", file=_out_credit)
print(f"
No sources were found that are relevant this target.
", file=_out_credit)
print(f"
", file=_out_credit)
du.print_w_time_elapsed(f'End output_credit_dist (no matches) at {datetime.now()}', start_time)
return '', _out_credit.getvalue()
if not credit_l:
print(f"", file=_out_credit)
print(f"
No sources were found that strongly support this target.
", file=_out_credit)
print(f"
", file=_out_credit)
url_to_body_w_credit = {}
futures = []
for url, _ in credit_l:
futures.append(executor.submit(du.get_article_from_url, url))
for f in futures:
article = f.result()
url_to_body_w_credit[article['url']] = article['text']
du.print_w_time_elapsed(f'Got url bodies', start_time)
for url, w in credit_l:
match_text = du.format_chunk_texts_for_display3(
url,
url_to_cid_to_ctext_map[url],
url_to_cid_to_ctext_formatted_map[url],
url_to_cid_to_nquotes_map[url],
)
print(f"", file=_out_credit)
favicon = f"
"
print(f"
{favicon}  {url_to_title[url]}{100*w:.0f}%
", file=_out_credit)
print(f"
", file=_out_credit)
print(f"
", file=_out_credit)
print(f"
{url_to_body_w_credit[url]}
", file=_out_credit)
print(f"
{match_text}
", file=_out_credit)
print(f"
", file=_out_credit)
print(f"
", file=_out_credit)
print(f"", file=_out_claims)
print(f"
Breakdown of article support for each extracted claim
", file=_out_claims)
for j, atom_support in enumerate(atom_support_l):
n_urls = len(atom_support.keys())
n_support = sum([1 if determination['true'] else 0 for determination in atom_support.values()])
print(f"", file=_out_claims)
for url, aggmatch_determination in atom_support.items():
title = url_to_title[url]
print(f"
{title}
", file=_out_claims)
print(f"
", file=_out_claims)
print(f"
Determination: {'Supported' if aggmatch_determination['true'] else 'NOT supported'}.
", file=_out_claims)
print(f"
Rationale: {aggmatch_determination['rationale']}
", file=_out_claims)
# if aggmatch_determination.get('quote_matches_l', None):
# for qid, qtext in enumerate(aggmatch_determination['quote_matches_l']):
# print(f"
Quote {qid}: {qtext}
", file=_out_claims)
use_formatted = 'chunk_text_formatted_l' in aggmatch_determination and aggmatch_determination['chunk_text_formatted_l']
chunk_text_l_key = 'chunk_text_formatted_l' if use_formatted else 'chunk_text_l'
for cid, ctext in zip(aggmatch_determination['id_l'], aggmatch_determination[chunk_text_l_key]):
print(f"
Chunk {cid}: {ctext}
", file=_out_claims)
print(f"
", file=_out_claims)
cur_idx[0] = 0
du.print_w_time_elapsed(f'End output_credit_dist at {datetime.now()}', start_time)
return 'Show claim breakdown', _out_credit.getvalue()
def toggle_output(cur_idx, _out_credit, _out_claims):
if cur_idx[0] < 0:
return ''
cur_idx[0] += 1
if cur_idx[0] % 2 == 0:
return 'Show claim breakdown', _out_credit.getvalue()
return 'Back to attribution', _out_claims.getvalue()
with gr.Blocks(theme=gr.themes.Default(text_size="lg")) as demo:
_out_credit_var = gr.State(StringIO)
_out_claims_var = gr.State(StringIO)
cur_idx_var = gr.State([0])
msg = gr.Textbox(label='Target')
results_box = gr.HTML(label='Matches')
toggle = gr.Button("")
msg.submit(output_credit_dist_nollm, [msg, cur_idx_var, _out_credit_var, _out_claims_var], [toggle, results_box], queue=False)
toggle.click(toggle_output, [cur_idx_var, _out_credit_var, _out_claims_var], [toggle, results_box], queue=False)
results_box.change(None, scroll_to_output=True)
if __name__ == "__main__":
demo.queue()
demo.launch()