File size: 3,594 Bytes
dfe34bb
 
 
 
 
 
 
 
 
 
88317c7
dfe34bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3492c23
dfe34bb
3492c23
b023803
dfe34bb
 
3492c23
 
 
dfe34bb
 
 
 
 
 
4a6ed35
dfe34bb
 
 
 
 
 
 
 
 
4a6ed35
3492c23
 
 
 
 
 
 
 
dfe34bb
3492c23
 
 
88317c7
 
 
 
 
 
dfe34bb
 
 
3492c23
dfe34bb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

import sys
import os

# ✅ Add src to Python path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "src")))

from txagent.txagent import TxAgent  # ✅ Now this will work
import pandas as pd
import pdfplumber
import gradio as gr


def extract_structured_text_from_csv(file_path):
    try:
        df = pd.read_csv(file_path)
        relevant_columns = [
            "Booking Number", "Form Name", "Form Item",
            "Item Response", "Interviewer", "Interview Date"
        ]
        df = df[[col for col in relevant_columns if col in df.columns]]
        return df.to_string(index=False)
    except Exception as e:
        return f"Error parsing CSV: {e}"


def extract_structured_text_from_pdf(file_path):
    extracted = []
    try:
        with pdfplumber.open(file_path) as pdf:
            for page in pdf.pages:
                tables = page.extract_tables()
                for table in tables:
                    for row in table:
                        if any(row):
                            extracted.append("\t".join([cell or "" for cell in row]))
        return "\n".join(extracted)
    except Exception as e:
        return f"Error parsing PDF: {e}"


def create_ui(agent: TxAgent):
    with gr.Blocks(theme=gr.themes.Soft()) as demo:
        gr.Markdown("<h1 style='text-align: center;'>\ud83d\udc8a TxAgent: Therapeutic Reasoning</h1>")
        chatbot = gr.Chatbot(label="TxAgent", height=600, type="messages")

        file_upload = gr.File(label="Upload Medical File", file_types=[".pdf", ".txt", ".docx", ".jpg", ".png", ".csv"], file_count="multiple")
        message_input = gr.Textbox(placeholder="Ask a biomedical question or just upload the files...", show_label=False)
        send_button = gr.Button("Send", variant="primary")
        conversation_state = gr.State([])

        def handle_chat(message, history, conversation, uploaded_files):
            context = (
                "You are a clinical AI reviewing patient form data from interviews. "
                "Your task is to analyze the responses, dates, and items, and reason step-by-step about "
                "what the doctor might have overlooked. Do not summarize or answer yet — just reason step-by-step first."
            )

            if uploaded_files:
                extracted_text = ""
                for file in uploaded_files:
                    path = file.name
                    if path.endswith(".csv"):
                        extracted_text += extract_structured_text_from_csv(path) + "\n"
                    elif path.endswith(".pdf"):
                        extracted_text += extract_structured_text_from_pdf(path) + "\n"
                message = f"{context}\n\n---\n{extracted_text.strip()}\n---\n\nNow reason what the doctor might have missed."

            generator = agent.run_gradio_chat(
                message=message,
                history=history,
                temperature=0.3,
                max_new_tokens=1024,
                max_token=8192,
                call_agent=False,
                conversation=conversation,
                uploaded_files=uploaded_files,
                max_round=30
            )
            for update in generator:
                yield update

        inputs = [message_input, chatbot, conversation_state, file_upload]
        send_button.click(fn=handle_chat, inputs=inputs, outputs=chatbot)
        message_input.submit(fn=handle_chat, inputs=inputs, outputs=chatbot)

        gr.Examples([
            ["Upload the files"],
        ], inputs=message_input)

    return demo