| import os |
| import json |
| from openai import OpenAI |
| from env.environment import OpsDeskEnv |
| from env.models import Action |
|
|
| def run_inference(): |
| api_key = os.getenv("HF_TOKEN") or os.getenv("OPENAI_API_KEY", "dummy_token") |
| base_url = os.getenv("API_BASE_URL", "https://router.huggingface.co/v1") |
| model_name = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-72B-Instruct") |
| |
| task_name = "opsdesk-hard" |
| benchmark = "OpsDesk" |
|
|
| client = OpenAI(api_key=api_key, base_url=base_url) |
| |
| env = OpsDeskEnv(task_level="HARD", max_steps=5) |
| obs = env.reset() |
| |
| print(f"[START] task={task_name} env={benchmark} model={model_name}", flush=True) |
| |
| terminated = False |
| step_num = 1 |
| rewards = [] |
| history = [] |
| |
| while not terminated: |
| history_block = "\n".join(history[-4:]) if history else "None" |
| prompt = f"""You are an AI operations assistant handling emails. |
| Step: {step_num} |
| Previous actions: |
| {history_block} |
| |
| Current Observation: {obs.model_dump_json(indent=2)} |
| |
| Available Actions: classify_email, extract_task, schedule_meeting, reply_email, ignore_email. |
| Return JSON ONLY in this format: {{"action_type": "...", "email_id": "...", "metadata": {{"classification": "urgent", "meeting_time": "2 PM"}}}}""" |
| |
| try: |
| resp = client.chat.completions.create( |
| model=model_name, |
| messages=[{"role": "user", "content": prompt}], |
| response_format={"type": "json_object"} |
| ) |
| content = resp.choices[0].message.content or "{}" |
| |
| content = content.replace("```json", "").replace("```", "").strip() |
| action_data = json.loads(content) |
| action = Action(**action_data) |
| error_val = "null" |
| except Exception as e: |
| action = Action(action_type="ignore_email", email_id="e1") |
| error_val = str(e).replace('\n', ' ') |
| |
| obs, reward, terminated, info = env.step(action) |
| rewards.append(reward.value) |
| action_str = f"{action.action_type}({action.email_id})" |
| done_val = str(terminated).lower() |
| |
| history.append(f"Step {step_num}: Action={action_str}, Reward={reward.value:.2f}") |
| |
| print(f"[STEP] step={step_num} action={action_str} reward={reward.value:.2f} done={done_val} error={error_val}", flush=True) |
| step_num += 1 |
| |
| score = info.get("score", 0.0) |
| score_clamped = min(max(score, 0.0), 1.0) |
| success = score_clamped >= 0.5 |
| rewards_str = ",".join(f"{r:.2f}" for r in rewards) |
| |
| print(f"[END] success={str(success).lower()} steps={step_num-1} score={score_clamped:.3f} rewards={rewards_str}", flush=True) |
|
|
| if __name__ == "__main__": |
| run_inference() |
|
|