PROTHAM commited on
Commit
cbb7810
·
1 Parent(s): 06ca7e4

fix: correct inference.py log format [START]/[STEP]/[END]

Browse files
Files changed (1) hide show
  1. inference.py +82 -74
inference.py CHANGED
@@ -1,16 +1,20 @@
1
  import os
2
  import json
3
  import asyncio
 
4
  from openai import OpenAI
5
  from client import APIDebugEnv
6
  from models import APIAction
7
 
8
- API_BASE_URL = os.environ["API_BASE_URL"]
9
- MODEL_NAME = os.environ["MODEL_NAME"]
10
- HF_TOKEN = os.environ["HF_TOKEN"]
11
- ENV_URL = os.environ.get("ENV_URL", "http://localhost:8000")
 
 
 
12
 
13
- llm = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN)
14
 
15
  SYSTEM_PROMPT = """You are an HTTP API debugger. You receive a broken request and must fix it to get HTTP 200.
16
  Respond ONLY in valid JSON with exactly these fields:
@@ -29,6 +33,24 @@ Rules:
29
  - do not add any text outside the JSON"""
30
 
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  def call_llm(task_description, broken_request, last_status, last_body, feedback):
33
  user_msg = (
34
  f"Task: {task_description}\n\n"
@@ -56,82 +78,68 @@ def call_llm(task_description, broken_request, last_status, last_body, feedback)
56
 
57
 
58
  async def run_task(env, task_id):
59
- obs = await env.reset(task_id=task_id)
60
- state = await env.state()
61
-
62
- print(json.dumps({
63
- "type": "[START]",
64
- "task_id": task_id,
65
- "episode_id": state.episode_id,
66
- "task_description": obs.task_description,
67
- "broken_request": obs.broken_request,
68
- }))
69
-
70
- final_reward = 0.0
71
- step_num = 0
72
-
73
- for step_num in range(state.max_steps):
74
- fixed = call_llm(
75
- obs.task_description,
76
- obs.broken_request,
77
- obs.last_status_code,
78
- obs.last_response_body,
79
- obs.step_feedback,
80
- )
81
-
82
- action = APIAction(
83
- method=str(fixed.get("method", "GET")),
84
- url=str(fixed.get("url", obs.broken_request.get("url", "/mock_api/users"))),
85
- headers=dict(fixed.get("headers") or {}),
86
- body=fixed.get("body") or {},
87
- query_params=dict(fixed.get("query_params") or {}),
88
- )
89
-
90
- result = await env.step(action)
91
- final_reward = result.reward
92
  obs = result.observation
 
 
 
 
 
93
 
94
- print(json.dumps({
95
- "type": "[STEP]",
96
- "task_id": task_id,
97
- "step": step_num + 1,
98
- "action": {
99
- "method": action.method,
100
- "url": action.url,
101
- "headers": action.headers,
102
- "body": action.body,
103
- "query_params": action.query_params,
104
- },
105
- "status_code": obs.last_status_code,
106
- "reward": result.reward,
107
- "done": result.done,
108
- "feedback": obs.step_feedback,
109
- }))
110
-
111
- if result.done:
112
- break
113
-
114
- print(json.dumps({
115
- "type": "[END]",
116
- "task_id": task_id,
117
- "final_reward": final_reward,
118
- "steps_taken": step_num + 1,
119
- }))
120
-
121
- return final_reward
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
 
124
  async def main():
125
  async with APIDebugEnv(base_url=ENV_URL) as env:
126
- scores = {}
127
  for task_id in ["easy", "medium", "hard"]:
128
- scores[task_id] = await run_task(env, task_id)
129
-
130
- print(json.dumps({
131
- "type": "[SUMMARY]",
132
- "scores": scores,
133
- "average": round(sum(scores.values()) / len(scores), 4),
134
- }))
135
 
136
 
137
  if __name__ == "__main__":
 
1
  import os
2
  import json
3
  import asyncio
4
+ from typing import List, Optional
5
  from openai import OpenAI
6
  from client import APIDebugEnv
7
  from models import APIAction
8
 
9
+ API_BASE_URL = os.getenv("API_BASE_URL") or "https://router.huggingface.co/v1"
10
+ MODEL_NAME = os.getenv("MODEL_NAME") or "mistralai/Mistral-7B-Instruct-v0.3"
11
+ API_KEY = os.getenv("HF_TOKEN") or os.getenv("API_KEY")
12
+ ENV_URL = os.getenv("ENV_URL", "http://localhost:7860")
13
+ BENCHMARK = "api_debug_env"
14
+ MAX_STEPS = 5
15
+ SUCCESS_SCORE_THRESHOLD = 0.8
16
 
17
+ llm = OpenAI(base_url=API_BASE_URL, api_key=API_KEY)
18
 
19
  SYSTEM_PROMPT = """You are an HTTP API debugger. You receive a broken request and must fix it to get HTTP 200.
20
  Respond ONLY in valid JSON with exactly these fields:
 
33
  - do not add any text outside the JSON"""
34
 
35
 
36
+ def log_start(task: str, env: str, model: str) -> None:
37
+ print(f"[START] task={task} env={env} model={model}", flush=True)
38
+
39
+
40
+ def log_step(step: int, action: str, reward: float, done: bool, error: Optional[str]) -> None:
41
+ error_val = error if error else "null"
42
+ done_val = str(done).lower()
43
+ print(
44
+ f"[STEP] step={step} action={action} reward={reward:.2f} done={done_val} error={error_val}",
45
+ flush=True,
46
+ )
47
+
48
+
49
+ def log_end(success: bool, steps: int, score: float, rewards: List[float]) -> None:
50
+ rewards_str = ",".join(f"{r:.2f}" for r in rewards)
51
+ print(f"[END] success={str(success).lower()} steps={steps} score={score:.3f} rewards={rewards_str}", flush=True)
52
+
53
+
54
  def call_llm(task_description, broken_request, last_status, last_body, feedback):
55
  user_msg = (
56
  f"Task: {task_description}\n\n"
 
78
 
79
 
80
  async def run_task(env, task_id):
81
+ rewards: List[float] = []
82
+ steps_taken = 0
83
+ score = 0.0
84
+ success = False
85
+
86
+ log_start(task=task_id, env=BENCHMARK, model=MODEL_NAME)
87
+
88
+ try:
89
+ result = await env.reset(task_id=task_id)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  obs = result.observation
91
+ state = await env.state()
92
+
93
+ for step in range(1, state.max_steps + 1):
94
+ if result.done:
95
+ break
96
 
97
+ fixed = call_llm(
98
+ obs.task_description,
99
+ obs.broken_request,
100
+ obs.last_status_code,
101
+ obs.last_response_body,
102
+ obs.step_feedback,
103
+ )
104
+
105
+ action = APIAction(
106
+ method=str(fixed.get("method", "GET")),
107
+ url=str(fixed.get("url", obs.broken_request.get("url", "/mock_api/users"))),
108
+ headers=dict(fixed.get("headers") or {}),
109
+ body=fixed.get("body") or {},
110
+ query_params=dict(fixed.get("query_params") or {}),
111
+ )
112
+
113
+ action_str = f"{action.method}:{action.url}"
114
+ result = await env.step(action)
115
+ reward = result.reward or 0.0
116
+ done = result.done
117
+ obs = result.observation
118
+
119
+ rewards.append(reward)
120
+ steps_taken = step
121
+
122
+ log_step(step=step, action=action_str, reward=reward, done=done, error=None)
123
+
124
+ if done:
125
+ break
126
+
127
+ score = max(rewards) if rewards else 0.0
128
+ success = score >= SUCCESS_SCORE_THRESHOLD
129
+
130
+ except Exception as e:
131
+ print(f"[DEBUG] Task {task_id} error: {e}", flush=True)
132
+
133
+ finally:
134
+ log_end(success=success, steps=steps_taken, score=score, rewards=rewards)
135
+
136
+ return score
137
 
138
 
139
  async def main():
140
  async with APIDebugEnv(base_url=ENV_URL) as env:
 
141
  for task_id in ["easy", "medium", "hard"]:
142
+ await run_task(env, task_id)
 
 
 
 
 
 
143
 
144
 
145
  if __name__ == "__main__":