File size: 3,022 Bytes
cc3fb29
 
7cd0b73
cc3fb29
7cd0b73
 
0cf172f
cc3fb29
 
 
14f7fbc
 
 
cc3fb29
4480940
 
7cd0b73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cc3fb29
 
 
 
 
 
 
 
 
7cd0b73
cc3fb29
7cd0b73
cc3fb29
7cd0b73
 
cc3fb29
 
7cd0b73
b1a2bc2
7cd0b73
 
 
 
 
878fba8
7cd0b73
 
 
 
878fba8
7cd0b73
 
 
 
 
 
 
 
 
 
 
 
cc3fb29
7cd0b73
 
 
 
 
 
 
cc3fb29
7cd0b73
cc3fb29
 
 
7cd0b73
cc3fb29
0cf172f
 
 
 
 
 
 
 
 
cc3fb29
 
14f7fbc
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
92
93
94
95
96
97
98
99
100
101
102
import os
import json
import pandas as pd
import gradio as gr
import openai
import time
from cpr import brd_g
from typing import List, Dict
from langchain.document_loaders import AirtableLoader

username = os.getenv('USERNAME')
password = os.getenv('PASSWORD')

# Set up API keys
AIRTABLE_API_KEY = os.getenv("AIRTABLE_API_KEY")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
BASE_ID = os.getenv("base_id")
TABLE_ID = os.getenv("table_id")
VIEW = os.getenv("view")

# Set up OpenAI client
openai.api_key = OPENAI_API_KEY
client = openai.Client(api_key=OPENAI_API_KEY)

# Set up assistant
ASSISTANT_ID = os.getenv('assistant_id')
assistant = client.beta.assistants.retrieve(ASSISTANT_ID)
thread = client.beta.threads.create()

# Function to load data from Airtable and return as a DataFrame
def load_airtable_data() -> pd.DataFrame:
    loader = AirtableLoader(AIRTABLE_API_KEY, TABLE_ID, BASE_ID, view=VIEW)
    documents = loader.load()
    data = []
    for doc in documents:
        try:
            record = json.loads(doc.page_content)
            data.append(record)
        except json.JSONDecodeError:
            print(f"Warning: Could not parse JSON for document: {doc.page_content[:100]}...")
            data.append({"raw_content": doc.page_content})
    return pd.DataFrame(data)

# Load Airtable data into DataFrame
try:
    airtable_data_df = load_airtable_data()
    print(f"Successfully loaded data from Airtable.")
except Exception as e:
    print(f"Error loading Airtable data: {str(e)}")
    airtable_data_df = pd.DataFrame()

# Function to chat with the assistant
def chat_with_assistant(message: str, dataframe: pd.DataFrame) -> str:
    dataframe_csv = dataframe.to_csv(index=False)
    
    full_message = f"""
    Here is the student information:
    {dataframe_csv}
    
    Here is my question: {message}
    
    Only output your answer without code.
    """
    
    client.beta.threads.messages.create(
        thread_id=thread.id,
        role="user",
        content=full_message
    )
    
    run = client.beta.threads.runs.create(
        thread_id=thread.id,
        assistant_id=ASSISTANT_ID
    )
    
    while True:
        run_status = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)
        if run_status.status == 'completed':
            messages = client.beta.threads.messages.list(thread_id=thread.id)
            assistant_response = messages.data[0].content[0].text.value
            break
        time.sleep(1)
    
    return assistant_response

# Define the Gradio interface
def gradio_interface(question: str) -> str:
    return chat_with_assistant(question, airtable_data_df)

with gr.Blocks() as demo:
    iface = gr.Interface(
        fn=gradio_interface,
        inputs="text",
        outputs=gr.Markdown(),
        title="📅 Summative Assessment Tracker",
        description="I am here to help you schedule summative assessments for your students",
    )
    gr.Markdown(brd_g)

# Launch the Gradio app
demo.launch(auth=(username,password))