FlexTime-AI / inference.py
HNS8273's picture
next update
a2fe35b
Raw
History Blame Contribute Delete
4.41 kB
"""
FlexTime Inference Baseline Script
Required by Hackathon Spec
"""
import asyncio
import json
import os
import textwrap
from typing import List, Optional
# Ensure the root dir is in path
import sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from openai import OpenAI
from server.engine import FlexTimeEnv, TASK_CONFIGS
from server.models import Action
from agent.llm_agent import LLMAgent
# Mandatory environment variables with defaults
API_BASE_URL = os.getenv("API_BASE_URL", "https://api.openai.com/v1")
MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4o-mini")
HF_TOKEN = os.getenv("HF_TOKEN")
BENCHMARK = "FlexTime"
MAX_STEPS = 120
TEMPERATURE = 0.0
MAX_TOKENS = 120
def log_start(task: str, env: str, model: str) -> None:
print(f"[START] task={task} env={env} model={model}", flush=True)
def log_step(step: int, action: str, reward: float, done: bool, error: Optional[str]) -> None:
error_val = error if error else "null"
done_val = str(done).lower()
print(
f"[STEP] step={step} action={action} reward={reward:.2f} done={done_val} error={error_val}",
flush=True,
)
def log_end(success: bool, steps: int, score: float, rewards: List[float]) -> None:
rewards_str = ",".join(f"{r:.2f}" for r in rewards)
print(
f"[END] success={str(success).lower()} steps={steps} score={score:.3f} rewards={rewards_str}",
flush=True
)
def run_task(agent: LLMAgent, env: FlexTimeEnv, task_id: str):
log_start(task=task_id, env=BENCHMARK, model=MODEL_NAME)
rewards: List[float] = []
steps_taken = 0
success = False
score = 0.0
try:
# Reset the environment for the specific task using a consistent seed
obs = env.reset(task_id=task_id, seed=42)
obs_dict = obs.model_dump()
done = False
cfg = TASK_CONFIGS[task_id]
cur_max_steps = min(MAX_STEPS, cfg["max_steps"])
target_score = cfg["target_score"]
agent.reset()
last_reward = None
last_error = None
for step in range(1, cur_max_steps + 1):
if done:
break
# Smart Early Termination
if len(rewards) >= 3 and rewards[-1] == rewards[-2] == rewards[-3]:
# Terminate if same reward repeats 3 times (no progress)
done = True
break
# Predict
action_dict = agent.generate_action(obs_dict, last_reward, last_error)
action_str = json.dumps(action_dict).replace(' ', '')
# Execute
try:
action = Action(**action_dict)
result = env.step(action)
obs_dict = result.observation.model_dump()
reward = result.reward.total or 0.0
done = result.done
error = None
except Exception as e:
# Execution failed due to malformed action
reward = -0.05
done = False
error = str(e).replace(' ', '_') # Replace spaces just in case format is very strictly space-delimited
rewards.append(reward)
steps_taken = step
last_reward = reward
last_error = error
log_step(step=step, action=action_str, reward=reward, done=done, error=error)
# Grading
grade = env.grade()
score = grade.get("score", 0.0)
score = min(max(score, 0.0), 1.0) # Clamp 0-1
success = score >= target_score
except Exception as overall_e:
print(f"[DEBUG] Overall environment failure: {overall_e}", flush=True)
finally:
log_end(success=success, steps=steps_taken, score=score, rewards=rewards)
def main():
if not HF_TOKEN:
print("[DEBUG] HF_TOKEN is missing. This will crash. Please set HF_TOKEN.", flush=True)
# We allow client initialization crash if token is missing as it enforces the constraint.
client = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN or "dummy-key")
env = FlexTimeEnv()
agent = LLMAgent(client, MODEL_NAME)
tasks = ["task_easy", "task_medium", "task_hard"]
for t_id in tasks:
run_task(agent, env, t_id)
if __name__ == "__main__":
main()