Meta-Hackathon1/Customer_Support_Env
0
1import asyncio2import os3import requests4import time5from openai import OpenAI6 7# REQUIRED ENV VARIABLES8API_BASE_URL = os.getenv("API_BASE_URL", "https://api.openai.com/v1")9MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4o-mini")10HF_TOKEN = os.getenv("HF_TOKEN")11 12if HF_TOKEN is None:13 raise ValueError("HF_TOKEN environment variable is required")14 15API_KEY = os.getenv("API_KEY", HF_TOKEN)16 17SPACE_URL = "https://meta-hackathon1-customer-support-env.hf.space"18BENCHMARK = "openenv"19MAX_STEPS = 2020 21TASK_NAMES = ["easy", "medium", "hard"]22 23 24# LLM AGENT25def get_model_message(client, state):26 prompt = f"""27You are a customer support agent.28 29State:30{state}31 32Choose ONLY ONE word:33refund / replace / reject / ask_proof34"""35 try:36 response = client.chat.completions.create(37 model=MODEL_NAME,38 messages=[{"role": "user", "content": prompt}]39 )40 return response.choices[0].message.content.strip().lower()41 except Exception as e:42 print(f"[ERROR] LLM failed: {e}", flush=True)43 return "reject"44 45 46# SAFE REQUEST47def safe_post(url, json=None, retries=3):48 for i in range(retries):49 try:50 return requests.post(url, json=json, timeout=10)51 except Exception as e:52 print(f"[DEBUG] retry {i+1} due to {e}", flush=True)53 time.sleep(2)54 raise Exception("Failed after retries")55 56def log_start(task, env, model):57 print(f"[START] task={task} env={env} model={model}", flush=True)58 59def log_step(step, action, reward, done, error=None):60 error_str = "null" if error is None else str(error)61 done_str = "true" if done else "false"62 print(63 f"[STEP] step={step} action={action} reward={reward:.2f} "64 f"done={done_str} error={error_str}",65 flush=True66 )67 68def log_end(success, steps, score, rewards):69 success_str = "true" if success else "false"70 rewards_str = ",".join(f"{r:.2f}" for r in rewards)71 print(f"[END] success={success_str} steps={steps} score={score:.4f} rewards={rewards_str}", flush=True)72 73 74# MAIN75async def main():76 client = OpenAI(base_url=API_BASE_URL, api_key=API_KEY)77 78 for task_name in TASK_NAMES:79 step_rewards = []80 score = 0.581 success = False82 83 log_start(task=task_name, env=BENCHMARK, model=MODEL_NAME)84 85 try:86 res = safe_post(f"{SPACE_URL}/reset", json={"task": task_name})87 result = res.json()88 89 state = result["observation"]["echoed_message"]90 done = result["done"]91 92 for step in range(1, MAX_STEPS + 1):93 if done:94 break95 96 action = get_model_message(client, state)97 98 res = safe_post(f"{SPACE_URL}/step", json={"message": action})99 result = res.json()100 101 state = result["observation"]["echoed_message"]102 done = result["done"]103 reward = float(result.get("reward", 0.0))104 105 step_rewards.append(reward)106 107 log_step(step=step, action=action, reward=reward, done=done, error=None)108 109 raw_score = float(result.get("info", {}).get("score", 0.5))110 score = max(0.05, min(0.95, raw_score))111 success = True112 113 except Exception as e:114 print(f"[ERROR] task={task_name} {e}", flush=True)115 score = 0.1116 117 finally:118 log_end(success=success, steps=len(step_rewards), score=score, rewards=step_rewards)119 120 121if __name__ == "__main__":122 asyncio.run(main())