Spaces:
Sleeping
Sleeping
Commit
·
de9fbbf
1
Parent(s):
9fc1785
Added Beta of system design interview
Browse files- app.py +6 -3
- resources/data.py +36 -22
- resources/prompts.py +35 -0
- ui/coding.py +24 -12
app.py
CHANGED
|
@@ -5,9 +5,8 @@ import gradio as gr
|
|
| 5 |
from api.audio import STTManager, TTSManager
|
| 6 |
from api.llm import LLMManager
|
| 7 |
from config import config
|
| 8 |
-
from docs.instruction import instruction
|
| 9 |
from resources.prompts import prompts
|
| 10 |
-
from ui.coding import
|
| 11 |
from ui.instructions import get_instructions_ui
|
| 12 |
from utils.params import default_audio_params
|
| 13 |
|
|
@@ -22,9 +21,13 @@ default_audio_params["streaming"] = stt.streaming
|
|
| 22 |
with gr.Blocks(title="AI Interviewer") as demo:
|
| 23 |
audio_output = gr.Audio(label="Play audio", autoplay=True, visible=os.environ.get("DEBUG", False), streaming=tts.streaming)
|
| 24 |
instructions_tab = get_instructions_ui(llm, tts, stt, default_audio_params)
|
| 25 |
-
coding_tab =
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
instructions_tab.render()
|
| 28 |
coding_tab.render()
|
|
|
|
| 29 |
|
| 30 |
demo.launch(show_api=False)
|
|
|
|
| 5 |
from api.audio import STTManager, TTSManager
|
| 6 |
from api.llm import LLMManager
|
| 7 |
from config import config
|
|
|
|
| 8 |
from resources.prompts import prompts
|
| 9 |
+
from ui.coding import get_problem_solving_ui
|
| 10 |
from ui.instructions import get_instructions_ui
|
| 11 |
from utils.params import default_audio_params
|
| 12 |
|
|
|
|
| 21 |
with gr.Blocks(title="AI Interviewer") as demo:
|
| 22 |
audio_output = gr.Audio(label="Play audio", autoplay=True, visible=os.environ.get("DEBUG", False), streaming=tts.streaming)
|
| 23 |
instructions_tab = get_instructions_ui(llm, tts, stt, default_audio_params)
|
| 24 |
+
coding_tab = get_problem_solving_ui(llm, tts, stt, default_audio_params, audio_output, name="Coding", interview_type="coding")
|
| 25 |
+
system_design_tab = get_problem_solving_ui(
|
| 26 |
+
llm, tts, stt, default_audio_params, audio_output, name="System Design (Beta)", interview_type="system_design"
|
| 27 |
+
)
|
| 28 |
|
| 29 |
instructions_tab.render()
|
| 30 |
coding_tab.render()
|
| 31 |
+
system_design_tab.render()
|
| 32 |
|
| 33 |
demo.launch(show_api=False)
|
resources/data.py
CHANGED
|
@@ -1,25 +1,39 @@
|
|
| 1 |
-
|
| 2 |
-
"
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
fixed_messages = {
|
| 25 |
"intro": "Nice to meet you! I'm your AI interviewer. Click 'Generate a problem' to start.",
|
|
|
|
| 1 |
+
topic_lists = {
|
| 2 |
+
"coding": [
|
| 3 |
+
"Arrays",
|
| 4 |
+
"Strings",
|
| 5 |
+
"Linked Lists",
|
| 6 |
+
"Hash Tables",
|
| 7 |
+
"Dynamic Programming",
|
| 8 |
+
"Trees",
|
| 9 |
+
"Graphs",
|
| 10 |
+
"Sorting Algorithms",
|
| 11 |
+
"Binary Search",
|
| 12 |
+
"Recursion",
|
| 13 |
+
"Greedy Algorithms",
|
| 14 |
+
"Stack",
|
| 15 |
+
"Queue",
|
| 16 |
+
"Heaps",
|
| 17 |
+
"Depth-First Search (DFS)",
|
| 18 |
+
"Breadth-First Search (BFS)",
|
| 19 |
+
"Backtracking",
|
| 20 |
+
"Bit Manipulation",
|
| 21 |
+
"Binary Search Trees",
|
| 22 |
+
"Tries",
|
| 23 |
+
],
|
| 24 |
+
"system_design": [
|
| 25 |
+
"Machine Learning Systems",
|
| 26 |
+
"Databases",
|
| 27 |
+
"Mobile Application Architecture",
|
| 28 |
+
"Web Services and APIs",
|
| 29 |
+
"Cloud Computing and Storage",
|
| 30 |
+
"Network Architecture and Protocols",
|
| 31 |
+
"Security and Compliance",
|
| 32 |
+
"Distributed Systems",
|
| 33 |
+
"Real-time and Batch Processing",
|
| 34 |
+
"Content Delivery Networks",
|
| 35 |
+
],
|
| 36 |
+
}
|
| 37 |
|
| 38 |
fixed_messages = {
|
| 39 |
"intro": "Nice to meet you! I'm your AI interviewer. Click 'Generate a problem' to start.",
|
resources/prompts.py
CHANGED
|
@@ -34,4 +34,39 @@ prompts = {
|
|
| 34 |
"Use code examples to illustrate points where necessary. Your feedback should be critical, aiming to fail candidates who do not meet high standards while providing detailed improvement areas. "
|
| 35 |
"Format all feedback in clear, structured markdown for readability."
|
| 36 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
}
|
|
|
|
| 34 |
"Use code examples to illustrate points where necessary. Your feedback should be critical, aiming to fail candidates who do not meet high standards while providing detailed improvement areas. "
|
| 35 |
"Format all feedback in clear, structured markdown for readability."
|
| 36 |
),
|
| 37 |
+
"system_design_problem_generation_prompt": (
|
| 38 |
+
"You are an AI acting as an interviewer. "
|
| 39 |
+
"Generate a scenario that tests the candidate's ability to architect scalable and robust systems. "
|
| 40 |
+
"Ensure the scenario tests for architectural understanding, integration of different technologies, security considerations, and scalability. "
|
| 41 |
+
"The scenario should be clearly stated, well-formatted, and solvable within 30 minutes. "
|
| 42 |
+
"Ensure the scenario varies each time to provide a wide range of challenges."
|
| 43 |
+
),
|
| 44 |
+
"system_design_interviewer_prompt": (
|
| 45 |
+
"As an AI interviewer, maintain a professional and analytical demeanor. "
|
| 46 |
+
"Encourage candidates to discuss various architectural choices and trade-offs without giving away direct solutions. Provide hints subtly only after observing significant struggles or upon explicit request. "
|
| 47 |
+
"Probe the candidate with questions related to system scalability, choice of technologies, data flow, security implications, and maintenance strategies to assess their architectural proficiency comprehensively. "
|
| 48 |
+
"If the candidate deviates from the core architectural focus, gently guide them back to the main issues. "
|
| 49 |
+
"After multiple unsuccessful attempts by the candidate to articulate or resolve design flaws, provide more direct hints or rephrase the scenario slightly to aid understanding. "
|
| 50 |
+
"Encourage the candidate to consider the practical implications of their design choices, asking how changes in system requirements might impact their architecture. "
|
| 51 |
+
"Discuss the trade-offs in their design decisions, encouraging them to justify their choices based on performance, cost, and complexity. "
|
| 52 |
+
"Prompt the candidate to explain potential scaling strategies and how they would handle increased load or data volume. "
|
| 53 |
+
"Keep your interactions concise and clear, avoiding overly technical language or complex explanations that could confuse the candidate."
|
| 54 |
+
),
|
| 55 |
+
"system_design_grading_feedback_prompt": (
|
| 56 |
+
"You are the AI grader for an interview. "
|
| 57 |
+
"The following is the interview transcript with the candidate's responses. "
|
| 58 |
+
"Ignore minor transcription errors unless they impact comprehension. "
|
| 59 |
+
"Evaluate the candidate’s performance based on the following criteria: "
|
| 60 |
+
"\n- **Architectural Understanding**: Knowledge of system components and their interactions."
|
| 61 |
+
"\n- **Technology Integration**: Usage of appropriate technologies and frameworks considering the problem's context."
|
| 62 |
+
"\n- **Scalability and Performance**: Ability to design systems that can scale efficiently and maintain performance."
|
| 63 |
+
"\n- **Security Awareness**: Consideration of potential security risks and mitigation strategies."
|
| 64 |
+
"\n- **System Robustness**: Design resilience and handling of potential system failures."
|
| 65 |
+
"\n- **Communication Skills**: Ability to articulate design decisions and respond to hypothetical changes."
|
| 66 |
+
"\n- **Problem Solving and Creativity**: Creativity in approaching complex system issues and solving problems."
|
| 67 |
+
"\n- **Decision Making**: Justification of design choices and trade-offs made during the discussion."
|
| 68 |
+
"\nProvide comprehensive feedback, detailing overall performance, specific design flaws, areas for improvement, communication issues, and other relevant observations. "
|
| 69 |
+
"Use system diagrams or pseudo-code to illustrate points where necessary. Your feedback should be critical, aiming to fail candidates who do not meet high standards while providing constructive areas for improvement. "
|
| 70 |
+
"Format all feedback in clear, structured markdown for readability."
|
| 71 |
+
),
|
| 72 |
}
|
ui/coding.py
CHANGED
|
@@ -1,16 +1,16 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
import numpy as np
|
| 3 |
|
| 4 |
-
from resources.data import
|
| 5 |
from utils.ui import add_candidate_message, add_interviewer_message
|
| 6 |
|
| 7 |
|
| 8 |
-
def
|
| 9 |
-
with gr.Tab(
|
| 10 |
chat_history = gr.State([])
|
| 11 |
previous_code = gr.State("")
|
| 12 |
started_coding = gr.State(False)
|
| 13 |
-
interview_type = gr.State(
|
| 14 |
with gr.Accordion("Settings") as init_acc:
|
| 15 |
with gr.Row():
|
| 16 |
with gr.Column():
|
|
@@ -27,7 +27,11 @@ def get_codding_ui(llm, tts, stt, default_audio_params, audio_output):
|
|
| 27 |
with gr.Row():
|
| 28 |
gr.Markdown("Topic (can type custom value)")
|
| 29 |
topic_select = gr.Dropdown(
|
| 30 |
-
label="Select topic",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
)
|
| 32 |
with gr.Column(scale=2):
|
| 33 |
requirements = gr.Textbox(label="Requirements", placeholder="Specify additional requirements", lines=5)
|
|
@@ -38,11 +42,19 @@ def get_codding_ui(llm, tts, stt, default_audio_params, audio_output):
|
|
| 38 |
with gr.Accordion("Solution", open=False) as solution_acc:
|
| 39 |
with gr.Row() as content:
|
| 40 |
with gr.Column(scale=2):
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
with gr.Column(scale=1):
|
| 47 |
end_btn = gr.Button("Finish the interview", interactive=False)
|
| 48 |
chat = gr.Chatbot(label="Chat", show_label=False, show_share_button=False)
|
|
@@ -119,8 +131,8 @@ def get_codding_ui(llm, tts, stt, default_audio_params, audio_output):
|
|
| 119 |
fn=lambda: gr.update(interactive=True), outputs=[send_btn]
|
| 120 |
).success(fn=lambda: None, outputs=[audio_input])
|
| 121 |
|
| 122 |
-
|
| 123 |
fn=tts.read_last_message, inputs=[chat], outputs=[audio_output]
|
| 124 |
)
|
| 125 |
|
| 126 |
-
return
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import numpy as np
|
| 3 |
|
| 4 |
+
from resources.data import fixed_messages, topic_lists
|
| 5 |
from utils.ui import add_candidate_message, add_interviewer_message
|
| 6 |
|
| 7 |
|
| 8 |
+
def get_problem_solving_ui(llm, tts, stt, default_audio_params, audio_output, name="Coding", interview_type="coding"):
|
| 9 |
+
with gr.Tab(name, render=False) as problem_tab:
|
| 10 |
chat_history = gr.State([])
|
| 11 |
previous_code = gr.State("")
|
| 12 |
started_coding = gr.State(False)
|
| 13 |
+
interview_type = gr.State(interview_type)
|
| 14 |
with gr.Accordion("Settings") as init_acc:
|
| 15 |
with gr.Row():
|
| 16 |
with gr.Column():
|
|
|
|
| 27 |
with gr.Row():
|
| 28 |
gr.Markdown("Topic (can type custom value)")
|
| 29 |
topic_select = gr.Dropdown(
|
| 30 |
+
label="Select topic",
|
| 31 |
+
choices=topic_lists[interview_type.value],
|
| 32 |
+
value=topic_lists[interview_type.value][0],
|
| 33 |
+
container=False,
|
| 34 |
+
allow_custom_value=True,
|
| 35 |
)
|
| 36 |
with gr.Column(scale=2):
|
| 37 |
requirements = gr.Textbox(label="Requirements", placeholder="Specify additional requirements", lines=5)
|
|
|
|
| 42 |
with gr.Accordion("Solution", open=False) as solution_acc:
|
| 43 |
with gr.Row() as content:
|
| 44 |
with gr.Column(scale=2):
|
| 45 |
+
if interview_type == "coding":
|
| 46 |
+
code = gr.Code(
|
| 47 |
+
label="Please write your code here. You can use any language, but only Python syntax highlighting is available.",
|
| 48 |
+
language="python",
|
| 49 |
+
lines=46,
|
| 50 |
+
)
|
| 51 |
+
else:
|
| 52 |
+
code = gr.Textbox(
|
| 53 |
+
label="Please write any notes for your solution here.",
|
| 54 |
+
lines=46,
|
| 55 |
+
max_lines=46,
|
| 56 |
+
show_label=False,
|
| 57 |
+
)
|
| 58 |
with gr.Column(scale=1):
|
| 59 |
end_btn = gr.Button("Finish the interview", interactive=False)
|
| 60 |
chat = gr.Chatbot(label="Chat", show_label=False, show_share_button=False)
|
|
|
|
| 131 |
fn=lambda: gr.update(interactive=True), outputs=[send_btn]
|
| 132 |
).success(fn=lambda: None, outputs=[audio_input])
|
| 133 |
|
| 134 |
+
problem_tab.select(fn=add_interviewer_message(fixed_messages["intro"]), inputs=[chat, started_coding], outputs=[chat]).success(
|
| 135 |
fn=tts.read_last_message, inputs=[chat], outputs=[audio_output]
|
| 136 |
)
|
| 137 |
|
| 138 |
+
return problem_tab
|