import gradio as gr import os from langchain_chroma.vectorstores import Chroma from langchain_huggingface.embeddings import ( HuggingFaceEmbeddings, HuggingFaceEndpointEmbeddings, ) import json from convert_to_json import data_to_json from template import make_template_outputs, make_template_testcases if os.environ.get("HUGGINGFACEHUB_API_TOKEN"): embedding = HuggingFaceEndpointEmbeddings( repo_id="sentence-transformers/all-MiniLM-L6-v2", huggingfacehub_api_token=os.environ["HUGGINGFACEHUB_API_TOKEN"], ) else: embedding = HuggingFaceEmbeddings( model_name="sentence-transformers/all-MiniLM-L6-v2" ) count = 0 def increment_count(): global count count += 1 return count def print_n_value(n_value): global no_tests no_tests = n_value return n_value # Return the value if needed for further processing def submit_second_page(topic): db_store = Chroma(collection_name="python-questions", persist_directory="./chroma", embedding_function=embedding) questions = db_store.similarity_search(topic) questions_json = json.loads(data_to_json(questions)) return questions_json, gr.update(choices=[d["question"] for d in questions_json]) def create_first_page(data_state): # solution_visible = gr.State(False) with gr.Column(visible=True) as page1: gr.Markdown("# Programming in Python") with gr.Row(): with gr.Column(scale=1): topic = gr.Textbox(label="Select Topic") submit2 = gr.Button("Submit", elem_id="submit2") with gr.Tab("Question"): question_select = gr.Dropdown( label="Select Question", choices=[], interactive=True ) question_display = gr.Textbox(label="Question", interactive=False) with gr.Tab("Test Cases"): testcases_state = gr.Markdown(label="Test Cases") with gr.Tab("Output"): outputs_md = gr.Markdown(label="Output") # JSON output component with gr.Tab("Solution 🔒"): solution = gr.Code("Solution Locked") with gr.Column(scale=1): code_input = gr.Code( label="Write your code here", language="python", lines=10, interactive=True, ) run_button = gr.Button("Run") # Connect buttons to functions submit2.click( fn=submit_second_page, inputs=[topic], outputs=[data_state, question_select] ) question_select.change( fn=make_template_testcases, inputs=[question_select, data_state], outputs=[solution, question_display, testcases_state, code_input], ) run_button.click( fn=lambda code, question, data: ( make_template_outputs(code, question, data) ), inputs=[code_input, question_select, data_state], outputs=[outputs_md], ) return page1, question_select # Initialize the Gradio app with gr.Blocks(css=".small-button { padding: 5px 10px; font-size: 12px; }") as demo: data_state = gr.State([]) # First page is now the new topic and question selection interface page1_content, question_select = create_first_page(data_state) demo.launch(share=True)