YAXH64 commited on
Commit
7bc4ef6
·
1 Parent(s): b6191e3

final fix: HF server

Browse files
Files changed (1) hide show
  1. inference.py +47 -49
inference.py CHANGED
@@ -1,22 +1,20 @@
1
  """
2
  inference.py — AI Code Review OpenEnv Environment
3
  Entry point for the hackathon validator.
4
-
5
- Log format (strict):
6
- [START] task=... env=... model=...
7
- [STEP] step=N action=... reward=0.00 done=true|false error=null|msg
8
- [END] success=true|false steps=N rewards=r1,r2,...
9
  """
10
 
11
  import os
12
  import sys
 
 
 
13
 
14
  from openai import OpenAI
15
  from env.environment import CodeReviewEnvironment
16
  from env.models import Action
17
 
18
  # ---------------------------------------------------------------------------
19
- # Environment variables (mandatory / with defaults)
20
  # ---------------------------------------------------------------------------
21
  API_BASE_URL = os.getenv("API_BASE_URL", "https://api.openai.com/v1")
22
  MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4.1-mini")
@@ -25,6 +23,20 @@ HF_TOKEN = os.getenv("HF_TOKEN")
25
  ENV_NAME = "ai-code-review-env"
26
  TASK_NAME = "code-review"
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  # ---------------------------------------------------------------------------
29
  # Prompt builders
30
  # ---------------------------------------------------------------------------
@@ -35,7 +47,6 @@ SYSTEM_PROMPT = """You are an expert code reviewer. You will be shown buggy code
35
 
36
  Be concise and precise. When fixing, output the complete corrected function wrapped in ```javascript ... ```."""
37
 
38
-
39
  def build_identify_prompt(obs) -> str:
40
  return (
41
  f"Task: {obs.task}\n\n"
@@ -43,7 +54,6 @@ def build_identify_prompt(obs) -> str:
43
  f"IDENTIFY the bug: explain what is wrong and why."
44
  )
45
 
46
-
47
  def build_fix_prompt(obs, identify_response: str) -> str:
48
  return (
49
  f"Task: {obs.task}\n\n"
@@ -52,30 +62,27 @@ def build_fix_prompt(obs, identify_response: str) -> str:
52
  f"FIX the code: return ONLY the corrected code in a ```{obs.language} ... ``` block."
53
  )
54
 
55
-
56
  # ---------------------------------------------------------------------------
57
  # LLM call
58
  # ---------------------------------------------------------------------------
59
 
60
  def call_llm(client: OpenAI, messages: list) -> str:
61
- """Call the LLM and return the text response. Raises on failure."""
62
  response = client.chat.completions.create(
63
  model=MODEL_NAME,
64
  messages=messages,
65
  max_tokens=512,
66
- temperature=0.0, # deterministic
67
  )
68
- return response.choices[0].message.content.strip()
69
-
70
 
71
  # ---------------------------------------------------------------------------
72
- # Log helpers — strict format, no deviation
73
  # ---------------------------------------------------------------------------
74
 
75
  def log_start():
76
  print(f"[START] task={TASK_NAME} env={ENV_NAME} model={MODEL_NAME}", flush=True)
77
 
78
-
79
  def log_step(step: int, action: str, reward: float, done: bool, error=None):
80
  error_str = "null" if error is None else str(error).replace("\n", " ")
81
  done_str = "true" if done else "false"
@@ -85,19 +92,16 @@ def log_step(step: int, action: str, reward: float, done: bool, error=None):
85
  flush=True,
86
  )
87
 
88
-
89
  def log_end(success: bool, steps: int, rewards: list):
90
  success_str = "true" if success else "false"
91
  rewards_str = ",".join(f"{r:.2f}" for r in rewards)
92
  print(f"[END] success={success_str} steps={steps} rewards={rewards_str}", flush=True)
93
 
94
-
95
  # ---------------------------------------------------------------------------
96
- # Main episode loop
97
  # ---------------------------------------------------------------------------
98
 
99
  def run():
100
- # Validate mandatory env var
101
  if not HF_TOKEN:
102
  log_start()
103
  log_end(success=False, steps=0, rewards=[])
@@ -109,63 +113,58 @@ def run():
109
 
110
  log_start()
111
 
112
- step_num = 0
113
- rewards = []
114
- success = False
115
- conversation = [] # rolling message history for the LLM
116
 
117
  try:
118
  obs = env.reset()
119
 
120
  while True:
121
- task = env.state
122
-
123
- # ── IDENTIFY step ────────────────────────────────────────────
124
  step_num += 1
125
  error = None
126
- identify_text = ""
127
 
128
  try:
129
- conversation = [
130
  {"role": "system", "content": SYSTEM_PROMPT},
131
- {"role": "user", "content": build_identify_prompt(obs)},
132
  ]
133
- identify_text = call_llm(client, conversation)
134
  except Exception as e:
 
135
  error = f"LLM error: {e}"
136
 
137
- identify_action = f"identify:task{obs.task_id}"
138
  result = env.step(Action(action_type="identify", content=identify_text))
139
-
140
  reward = result["reward"]
141
  done = result["done"]
 
142
  rewards.append(reward)
143
- log_step(step_num, identify_action, reward, done, error)
144
 
145
  if done:
146
  break
147
 
148
  obs = result["observation"]
149
 
150
- # ── FIX step ─────────────────────────────────────────────────
151
  step_num += 1
152
- error = None
153
- fix_text = ""
154
 
155
  try:
156
- conversation.append({"role": "assistant", "content": identify_text})
157
- conversation.append({"role": "user", "content": build_fix_prompt(obs, identify_text)})
158
- fix_text = call_llm(client, conversation)
159
  except Exception as e:
 
160
  error = f"LLM error: {e}"
161
 
162
- fix_action = f"fix:task{obs.task_id}"
163
  result = env.step(Action(action_type="fix", content=fix_text))
164
-
165
  reward = result["reward"]
166
  done = result["done"]
 
167
  rewards.append(reward)
168
- log_step(step_num, fix_action, reward, done, error)
169
 
170
  if done:
171
  break
@@ -175,26 +174,25 @@ def run():
175
  success = True
176
 
177
  except Exception as e:
178
- # Catch-all — always print END
179
- log_step(step_num + 1, "error", 0.00, True, error=str(e))
180
  log_end(success=False, steps=step_num, rewards=rewards)
181
- sys.exit(1)
 
182
 
183
  log_end(success=success, steps=step_num, rewards=rewards)
184
 
185
-
186
  # ---------------------------------------------------------------------------
187
  # Entry point
188
  # ---------------------------------------------------------------------------
189
 
190
- import time
191
-
192
  if __name__ == "__main__":
 
 
 
193
  try:
194
  run()
195
  except Exception as e:
196
  print(f"[FATAL] {e}", flush=True)
197
 
198
- # Keep container alive for HF Spaces
199
  while True:
200
  time.sleep(60)
 
1
  """
2
  inference.py — AI Code Review OpenEnv Environment
3
  Entry point for the hackathon validator.
 
 
 
 
 
4
  """
5
 
6
  import os
7
  import sys
8
+ import time
9
+ import threading
10
+ from http.server import HTTPServer, BaseHTTPRequestHandler
11
 
12
  from openai import OpenAI
13
  from env.environment import CodeReviewEnvironment
14
  from env.models import Action
15
 
16
  # ---------------------------------------------------------------------------
17
+ # Environment variables
18
  # ---------------------------------------------------------------------------
19
  API_BASE_URL = os.getenv("API_BASE_URL", "https://api.openai.com/v1")
20
  MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4.1-mini")
 
23
  ENV_NAME = "ai-code-review-env"
24
  TASK_NAME = "code-review"
25
 
26
+ # ---------------------------------------------------------------------------
27
+ # Simple HTTP server (REQUIRED for Hugging Face Spaces)
28
+ # ---------------------------------------------------------------------------
29
+
30
+ class SimpleHandler(BaseHTTPRequestHandler):
31
+ def do_GET(self):
32
+ self.send_response(200)
33
+ self.end_headers()
34
+ self.wfile.write(b"OK")
35
+
36
+ def start_server():
37
+ server = HTTPServer(("0.0.0.0", 7860), SimpleHandler)
38
+ server.serve_forever()
39
+
40
  # ---------------------------------------------------------------------------
41
  # Prompt builders
42
  # ---------------------------------------------------------------------------
 
47
 
48
  Be concise and precise. When fixing, output the complete corrected function wrapped in ```javascript ... ```."""
49
 
 
50
  def build_identify_prompt(obs) -> str:
51
  return (
52
  f"Task: {obs.task}\n\n"
 
54
  f"IDENTIFY the bug: explain what is wrong and why."
55
  )
56
 
 
57
  def build_fix_prompt(obs, identify_response: str) -> str:
58
  return (
59
  f"Task: {obs.task}\n\n"
 
62
  f"FIX the code: return ONLY the corrected code in a ```{obs.language} ... ``` block."
63
  )
64
 
 
65
  # ---------------------------------------------------------------------------
66
  # LLM call
67
  # ---------------------------------------------------------------------------
68
 
69
  def call_llm(client: OpenAI, messages: list) -> str:
 
70
  response = client.chat.completions.create(
71
  model=MODEL_NAME,
72
  messages=messages,
73
  max_tokens=512,
74
+ temperature=0.0,
75
  )
76
+ content = response.choices[0].message.content or ""
77
+ return content.strip()
78
 
79
  # ---------------------------------------------------------------------------
80
+ # Logging helpers
81
  # ---------------------------------------------------------------------------
82
 
83
  def log_start():
84
  print(f"[START] task={TASK_NAME} env={ENV_NAME} model={MODEL_NAME}", flush=True)
85
 
 
86
  def log_step(step: int, action: str, reward: float, done: bool, error=None):
87
  error_str = "null" if error is None else str(error).replace("\n", " ")
88
  done_str = "true" if done else "false"
 
92
  flush=True,
93
  )
94
 
 
95
  def log_end(success: bool, steps: int, rewards: list):
96
  success_str = "true" if success else "false"
97
  rewards_str = ",".join(f"{r:.2f}" for r in rewards)
98
  print(f"[END] success={success_str} steps={steps} rewards={rewards_str}", flush=True)
99
 
 
100
  # ---------------------------------------------------------------------------
101
+ # Main logic
102
  # ---------------------------------------------------------------------------
103
 
104
  def run():
 
105
  if not HF_TOKEN:
106
  log_start()
107
  log_end(success=False, steps=0, rewards=[])
 
113
 
114
  log_start()
115
 
116
+ step_num = 0
117
+ rewards = []
118
+ success = False
 
119
 
120
  try:
121
  obs = env.reset()
122
 
123
  while True:
124
+ # IDENTIFY
 
 
125
  step_num += 1
126
  error = None
 
127
 
128
  try:
129
+ messages = [
130
  {"role": "system", "content": SYSTEM_PROMPT},
131
+ {"role": "user", "content": build_identify_prompt(obs)},
132
  ]
133
+ identify_text = call_llm(client, messages)
134
  except Exception as e:
135
+ identify_text = ""
136
  error = f"LLM error: {e}"
137
 
 
138
  result = env.step(Action(action_type="identify", content=identify_text))
 
139
  reward = result["reward"]
140
  done = result["done"]
141
+
142
  rewards.append(reward)
143
+ log_step(step_num, f"identify:task{obs.task_id}", reward, done, error)
144
 
145
  if done:
146
  break
147
 
148
  obs = result["observation"]
149
 
150
+ # FIX
151
  step_num += 1
152
+ error = None
 
153
 
154
  try:
155
+ messages.append({"role": "assistant", "content": identify_text})
156
+ messages.append({"role": "user", "content": build_fix_prompt(obs, identify_text)})
157
+ fix_text = call_llm(client, messages)
158
  except Exception as e:
159
+ fix_text = ""
160
  error = f"LLM error: {e}"
161
 
 
162
  result = env.step(Action(action_type="fix", content=fix_text))
 
163
  reward = result["reward"]
164
  done = result["done"]
165
+
166
  rewards.append(reward)
167
+ log_step(step_num, f"fix:task{obs.task_id}", reward, done, error)
168
 
169
  if done:
170
  break
 
174
  success = True
175
 
176
  except Exception as e:
 
 
177
  log_end(success=False, steps=step_num, rewards=rewards)
178
+ print(f"[FATAL] {e}", flush=True)
179
+ return
180
 
181
  log_end(success=success, steps=step_num, rewards=rewards)
182
 
 
183
  # ---------------------------------------------------------------------------
184
  # Entry point
185
  # ---------------------------------------------------------------------------
186
 
 
 
187
  if __name__ == "__main__":
188
+ # Start HTTP server (required for HF Spaces)
189
+ threading.Thread(target=start_server, daemon=True).start()
190
+
191
  try:
192
  run()
193
  except Exception as e:
194
  print(f"[FATAL] {e}", flush=True)
195
 
196
+ # Keep container alive
197
  while True:
198
  time.sleep(60)