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))