|
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') |
|
|
|
|
|
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") |
|
|
|
|
|
openai.api_key = OPENAI_API_KEY |
|
client = openai.Client(api_key=OPENAI_API_KEY) |
|
|
|
|
|
ASSISTANT_ID = os.getenv('assistant_id') |
|
assistant = client.beta.assistants.retrieve(ASSISTANT_ID) |
|
thread = client.beta.threads.create() |
|
|
|
|
|
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) |
|
|
|
|
|
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() |
|
|
|
|
|
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 |
|
|
|
|
|
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) |
|
|
|
|
|
demo.launch(auth=(username,password)) |
|
|