Vishvam10 commited on
Commit
7da7490
·
1 Parent(s): 7adced5

debug: (inference) yeah, given up fully part 2

Browse files
Files changed (2) hide show
  1. inference.py +77 -105
  2. local_log_server.py +0 -9
inference.py CHANGED
@@ -1,116 +1,89 @@
1
  import asyncio
2
  import os
3
- import sys
4
  import json
5
- import subprocess
6
- import time
7
- import threading
8
  from pathlib import Path
9
-
10
- import httpx
11
  from dotenv import load_dotenv
12
  from openai import OpenAI
13
 
14
- ROOT = Path(__file__).parent.resolve()
15
- if str(ROOT) not in sys.path:
16
- sys.path.insert(0, str(ROOT))
17
 
18
- TASK_DIR = ROOT / "tasks"
19
 
20
- from cloudenv.client import ClientEnvironment # noqa
21
- from cloudenv.models import CloudEnvAction, CloudEnvObservation # noqa
22
 
23
- load_dotenv()
 
 
 
24
 
25
  HF_TOKEN = os.getenv("HF_TOKEN") or os.getenv("API_KEY")
26
- API_BASE_URL = os.getenv("API_BASE_URL", "https://api.openai.com/v1")
27
  MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4o")
28
-
29
- MAX_STEPS = int(os.getenv("MAX_STEPS", "20"))
30
- TEMPERATURE = float(os.getenv("TEMPERATURE", "0.3"))
31
- MAX_TOKENS = int(os.getenv("MAX_TOKENS", "300"))
32
-
33
- SERVER_URL = "http://127.0.0.1:8000"
34
-
35
- TASK_ORDER = ["easy-task", "medium-task", "hard-task"]
36
 
37
  client = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN)
38
 
39
- SYSTEM_PROMPT = '{"service":"","operation":"","instance_id":null,"payload":{}}'
40
-
41
-
42
- def start_ministack():
43
- proc = subprocess.Popen(
44
- ["uv", "run", "ministack"],
45
- cwd=ROOT,
46
- stdout=subprocess.DEVNULL,
47
- stderr=subprocess.DEVNULL,
48
- )
49
- time.sleep(3)
50
- return proc
51
-
52
-
53
- def start_server():
54
- proc = subprocess.Popen(
55
- ["uv", "run", "server"],
56
- cwd=ROOT,
57
- stdout=subprocess.PIPE,
58
- stderr=subprocess.STDOUT,
59
- text=True,
60
- bufsize=1,
61
- )
62
-
63
- def stream():
64
- for line in proc.stdout:
65
- print(f"[SERVER] {line}", end="")
66
-
67
- threading.Thread(target=stream, daemon=True).start()
68
-
69
- for _ in range(40):
70
- r = httpx.get(f"{SERVER_URL}/docs", timeout=1)
71
- if r.status_code == 200:
72
- print("[INFO] server ready")
73
- return proc
74
- time.sleep(1)
75
-
76
- raise RuntimeError("server failed")
77
 
78
 
 
 
 
79
  def load_task(name: str):
80
  return json.loads((TASK_DIR / f"{name}.json").read_text())
81
 
82
 
83
- def register_pipeline(task):
84
- url = f"{SERVER_URL}/api/pipelines"
85
- with httpx.Client(timeout=20) as http:
86
- r = http.post(url, json=task)
 
 
 
 
 
 
 
 
 
87
 
88
- if r.status_code == 400:
89
- detail = r.json().get("detail", "")
90
- if "already exists" in detail:
91
- http.delete(f"{url}/{task['pipeline_id']}")
92
- http.post(url, json=task)
93
 
94
- r.raise_for_status()
 
95
 
 
 
96
 
97
- def parse_action(raw: str, task_id: str, episode_id: str) -> CloudEnvAction:
98
- raw = raw.strip()
99
- raw = raw[raw.find("{") : raw.rfind("}") + 1]
100
- d = json.loads(raw)
101
 
102
- return CloudEnvAction(
103
- task_id=task_id,
104
- episode_id=episode_id,
105
- service=d.get("service", "internal"),
106
- instance_id=d.get("instance_id"),
107
- operation=d.get("operation", "GetCallerIdentity"),
108
- payload=d.get("payload", {}),
109
- principal_arn=d.get("principal_arn"),
110
- intent=d.get("intent"),
111
- )
 
 
 
 
 
 
 
 
 
112
 
113
 
 
 
 
114
  def call_model(step, state, broken, ideal, history):
115
  prompt = f"""
116
  STEP {step}
@@ -126,32 +99,30 @@ HISTORY {history[-5:]}
126
  {"role": "system", "content": SYSTEM_PROMPT},
127
  {"role": "user", "content": prompt},
128
  ],
129
- temperature=TEMPERATURE,
130
- max_tokens=MAX_TOKENS,
131
  )
132
 
133
  return (res.choices[0].message.content or "").strip()
134
 
135
 
136
- def run_episode(task):
 
 
 
137
  pipeline_id = task["pipeline_id"]
138
  task_id = pipeline_id
139
  episode_id = f"{pipeline_id}-episode-1"
140
 
141
- env = ClientEnvironment(base_url=SERVER_URL)
142
-
143
- register_pipeline(task)
144
-
145
- result = asyncio.run(
146
- env.initialize_environment(task_id=task_id, episode_id=episode_id)
147
  )
148
 
149
  obs = result.observation
150
-
151
  history = []
152
  rewards = []
153
 
154
- for step in range(MAX_STEPS):
155
  if obs.done:
156
  break
157
 
@@ -165,27 +136,28 @@ def run_episode(task):
165
 
166
  action = parse_action(raw, task_id, episode_id)
167
 
168
- result = asyncio.run(env.step(action))
169
  obs = result.observation
170
 
171
- rewards.append(float(obs.reward or 0))
172
  history.append(raw)
173
 
174
  score = sum(rewards) / (len(rewards) or 1)
175
  print(f"[END] task={task_id} score={score:.3f}")
176
 
177
 
178
- def main():
179
- miniproc = start_ministack()
180
- serverproc = start_server()
 
 
 
 
181
 
182
  for name in TASK_ORDER:
183
  task = load_task(name)
184
- run_episode(task)
185
-
186
- miniproc.terminate()
187
- serverproc.terminate()
188
 
189
 
190
  if __name__ == "__main__":
191
- main()
 
1
  import asyncio
2
  import os
 
3
  import json
 
 
 
4
  from pathlib import Path
 
 
5
  from dotenv import load_dotenv
6
  from openai import OpenAI
7
 
8
+ from cloudenv.client import ClientEnvironment
9
+ from cloudenv.models import CloudEnvAction
 
10
 
11
+ load_dotenv()
12
 
13
+ ROOT = Path(__file__).parent.resolve()
14
+ TASK_DIR = ROOT / "tasks"
15
 
16
+ # ----------------------------
17
+ # SYSTEM PROMPT (FILE)
18
+ # ----------------------------
19
+ SYSTEM_PROMPT = (ROOT / "system_prompt.txt").read_text().strip()
20
 
21
  HF_TOKEN = os.getenv("HF_TOKEN") or os.getenv("API_KEY")
 
22
  MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4o")
23
+ API_BASE_URL = os.getenv("API_BASE_URL", "https://api.openai.com/v1")
 
 
 
 
 
 
 
24
 
25
  client = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN)
26
 
27
+ TASK_ORDER = ["easy-task", "medium-task", "hard-task"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
 
30
+ # ----------------------------
31
+ # LOAD TASK
32
+ # ----------------------------
33
  def load_task(name: str):
34
  return json.loads((TASK_DIR / f"{name}.json").read_text())
35
 
36
 
37
+ # ----------------------------
38
+ # SAFE ACTION PARSER (FIXED)
39
+ # ----------------------------
40
+ def parse_action(raw: str, task_id: str, episode_id: str) -> CloudEnvAction:
41
+ # ALWAYS guarantee validity
42
+ if not raw or not isinstance(raw, str):
43
+ return CloudEnvAction(
44
+ task_id=task_id,
45
+ episode_id=episode_id,
46
+ service="internal",
47
+ operation="NoOp",
48
+ payload={},
49
+ )
50
 
51
+ try:
52
+ raw = raw.strip()
 
 
 
53
 
54
+ start = raw.find("{")
55
+ end = raw.rfind("}")
56
 
57
+ if start == -1 or end == -1 or end <= start:
58
+ raise ValueError("No JSON found")
59
 
60
+ raw_json = raw[start : end + 1]
61
+ d = json.loads(raw_json)
 
 
62
 
63
+ return CloudEnvAction(
64
+ task_id=task_id,
65
+ episode_id=episode_id,
66
+ service=d.get("service", "internal"),
67
+ instance_id=d.get("instance_id"),
68
+ operation=d.get("operation", "NoOp"),
69
+ payload=d.get("payload", {}),
70
+ principal_arn=d.get("principal_arn"),
71
+ intent=d.get("intent"),
72
+ )
73
+
74
+ except Exception:
75
+ return CloudEnvAction(
76
+ task_id=task_id,
77
+ episode_id=episode_id,
78
+ service="internal",
79
+ operation="NoOp",
80
+ payload={},
81
+ )
82
 
83
 
84
+ # ----------------------------
85
+ # LLM CALL
86
+ # ----------------------------
87
  def call_model(step, state, broken, ideal, history):
88
  prompt = f"""
89
  STEP {step}
 
99
  {"role": "system", "content": SYSTEM_PROMPT},
100
  {"role": "user", "content": prompt},
101
  ],
102
+ temperature=0.0,
 
103
  )
104
 
105
  return (res.choices[0].message.content or "").strip()
106
 
107
 
108
+ # ----------------------------
109
+ # EPISODE RUN
110
+ # ----------------------------
111
+ async def run_episode(task, env: ClientEnvironment):
112
  pipeline_id = task["pipeline_id"]
113
  task_id = pipeline_id
114
  episode_id = f"{pipeline_id}-episode-1"
115
 
116
+ result = await env.reset(
117
+ task_id=task_id,
118
+ episode_id=episode_id,
 
 
 
119
  )
120
 
121
  obs = result.observation
 
122
  history = []
123
  rewards = []
124
 
125
+ for step in range(20):
126
  if obs.done:
127
  break
128
 
 
136
 
137
  action = parse_action(raw, task_id, episode_id)
138
 
139
+ result = await env.step(action)
140
  obs = result.observation
141
 
142
+ rewards.append(float(obs.reward or 0.0))
143
  history.append(raw)
144
 
145
  score = sum(rewards) / (len(rewards) or 1)
146
  print(f"[END] task={task_id} score={score:.3f}")
147
 
148
 
149
+ # ----------------------------
150
+ # MAIN
151
+ # ----------------------------
152
+ async def main():
153
+ env = await ClientEnvironment.from_env(
154
+ "Vishvam10/cloudenv", use_docker=False
155
+ )
156
 
157
  for name in TASK_ORDER:
158
  task = load_task(name)
159
+ await run_episode(task, env)
 
 
 
160
 
161
 
162
  if __name__ == "__main__":
163
+ asyncio.run(main())
local_log_server.py DELETED
@@ -1,9 +0,0 @@
1
- from fastapi import FastAPI, Request
2
-
3
- app = FastAPI()
4
-
5
- @app.post("/log")
6
- async def receive_log(req: Request):
7
- data = await req.json()
8
- print(data["line"], flush=True)
9
- return {"ok": True}