Spaces:
Sleeping
Sleeping
IliaLarchenko
commited on
Commit
•
9f4cedf
1
Parent(s):
b5acaa5
Candidate switch to stream and modes
Browse files- tests/candidate.py +38 -23
tests/candidate.py
CHANGED
@@ -23,9 +23,11 @@ def complete_interview(
|
|
23 |
topic: str = "",
|
24 |
model: str = "gpt-3.5-turbo",
|
25 |
pause: int = 0,
|
|
|
|
|
26 |
) -> Tuple[str, Dict]:
|
27 |
"""
|
28 |
-
Complete an interview and record the results.
|
29 |
|
30 |
:param interview_type: Type of interview to complete.
|
31 |
:param exp_name: Experiment name for file saving.
|
@@ -35,6 +37,8 @@ def complete_interview(
|
|
35 |
:param topic: Topic for the interview.
|
36 |
:param model: Model to use for the candidate.
|
37 |
:param pause: Pause duration between requests to prevent rate limits.
|
|
|
|
|
38 |
:return: Tuple containing the file path and interview data.
|
39 |
"""
|
40 |
client = OpenAI(base_url="https://api.openai.com/v1")
|
@@ -48,7 +52,8 @@ def complete_interview(
|
|
48 |
topic = topic or random.choice(topic_lists[interview_type])
|
49 |
difficulty = difficulty or random.choice(["easy", "medium", "hard"])
|
50 |
|
51 |
-
problem_statement_text
|
|
|
52 |
|
53 |
interview_data = defaultdict(
|
54 |
lambda: None,
|
@@ -80,33 +85,41 @@ def complete_interview(
|
|
80 |
response_times = []
|
81 |
previous_code = ""
|
82 |
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
continue
|
95 |
|
96 |
-
messages_candidate.append({"role": "assistant", "content":
|
97 |
|
98 |
-
|
99 |
-
interview_data["transcript"].append(f"CANDIDATE CODE AND NOTES: {code}")
|
100 |
-
elif candidate_message:
|
101 |
-
interview_data["transcript"].append(f"CANDIDATE MESSAGE: {candidate_message}")
|
102 |
|
103 |
chat_display.append([candidate_message, None])
|
104 |
|
105 |
-
if response_json.get("finished") and not response_json.get("question"):
|
106 |
-
break
|
107 |
-
|
108 |
send_time = time.time()
|
109 |
-
messages_interviewer, chat_display, previous_code
|
|
|
|
|
|
|
|
|
110 |
response_times.append(time.time() - send_time)
|
111 |
|
112 |
messages_candidate.append({"role": "user", "content": chat_display[-1][1]})
|
@@ -119,7 +132,9 @@ def complete_interview(
|
|
119 |
|
120 |
time.sleep(pause) # to prevent exceeding rate limits
|
121 |
|
122 |
-
|
|
|
|
|
123 |
interview_data["average_response_time_seconds"] = round(sum(response_times) / len(response_times), 2) if response_times else 0
|
124 |
|
125 |
current_time = time.strftime("%Y%m%d-%H%M%S")
|
|
|
23 |
topic: str = "",
|
24 |
model: str = "gpt-3.5-turbo",
|
25 |
pause: int = 0,
|
26 |
+
mode: str = "normal",
|
27 |
+
max_messages: Optional[int] = None,
|
28 |
) -> Tuple[str, Dict]:
|
29 |
"""
|
30 |
+
Complete an interview and record the results with additional strange use cases.
|
31 |
|
32 |
:param interview_type: Type of interview to complete.
|
33 |
:param exp_name: Experiment name for file saving.
|
|
|
37 |
:param topic: Topic for the interview.
|
38 |
:param model: Model to use for the candidate.
|
39 |
:param pause: Pause duration between requests to prevent rate limits.
|
40 |
+
:param mode: Mode of operation ("normal", "empty", "gibberish", "repeat").
|
41 |
+
:param max_messages: Maximum number of messages in the conversation.
|
42 |
:return: Tuple containing the file path and interview data.
|
43 |
"""
|
44 |
client = OpenAI(base_url="https://api.openai.com/v1")
|
|
|
52 |
topic = topic or random.choice(topic_lists[interview_type])
|
53 |
difficulty = difficulty or random.choice(["easy", "medium", "hard"])
|
54 |
|
55 |
+
for problem_statement_text in llm.get_problem(requirements, difficulty, topic, interview_type):
|
56 |
+
pass
|
57 |
|
58 |
interview_data = defaultdict(
|
59 |
lambda: None,
|
|
|
85 |
response_times = []
|
86 |
previous_code = ""
|
87 |
|
88 |
+
if max_messages is None:
|
89 |
+
max_messages = 30 if mode == "normal" else 5
|
90 |
+
|
91 |
+
for _ in range(max_messages):
|
92 |
+
if mode == "empty":
|
93 |
+
response_content = ""
|
94 |
+
elif mode == "gibberish":
|
95 |
+
response_content = "".join(random.choices(string.ascii_letters + string.digits, k=50))
|
96 |
+
elif mode == "repeat":
|
97 |
+
response_content = chat_display[-1][1]
|
98 |
+
else: # normal mode
|
99 |
+
response = client.chat.completions.create(
|
100 |
+
model=model, messages=messages_candidate, temperature=1, response_format={"type": "json_object"}
|
101 |
+
)
|
102 |
+
response_json = json.loads(response.choices[0].message.content)
|
103 |
+
response_content = response_json.get("message", "")
|
104 |
+
|
105 |
+
candidate_message = response_content
|
106 |
+
|
107 |
+
if not candidate_message and mode != "empty":
|
108 |
+
print("No message in response")
|
109 |
continue
|
110 |
|
111 |
+
messages_candidate.append({"role": "assistant", "content": candidate_message})
|
112 |
|
113 |
+
interview_data["transcript"].append(f"CANDIDATE MESSAGE: {candidate_message}")
|
|
|
|
|
|
|
114 |
|
115 |
chat_display.append([candidate_message, None])
|
116 |
|
|
|
|
|
|
|
117 |
send_time = time.time()
|
118 |
+
for messages_interviewer, chat_display, previous_code in llm.send_request(
|
119 |
+
candidate_message, previous_code, messages_interviewer, chat_display
|
120 |
+
):
|
121 |
+
pass
|
122 |
+
|
123 |
response_times.append(time.time() - send_time)
|
124 |
|
125 |
messages_candidate.append({"role": "user", "content": chat_display[-1][1]})
|
|
|
132 |
|
133 |
time.sleep(pause) # to prevent exceeding rate limits
|
134 |
|
135 |
+
for fb in llm.end_interview(problem_statement_text, messages_interviewer, interview_type):
|
136 |
+
interview_data["feedback"] = fb
|
137 |
+
|
138 |
interview_data["average_response_time_seconds"] = round(sum(response_times) / len(response_times), 2) if response_times else 0
|
139 |
|
140 |
current_time = time.strftime("%Y%m%d-%H%M%S")
|