import os from dataclasses import dataclass from pathlib import Path from dotenv import load_dotenv load_dotenv(Path(__file__).with_name(".env")) @dataclass(frozen=True) class Servo: key: str name: str role: str home: int lo: int = 0 hi: int = 180 # Keep lo/hi in sync with LIMITS in robot_arm.ino SERVOS = ( Servo("s1", "base", "rotates the whole arm left/right; lower = right, higher = left", home=50), Servo("s2", "shoulder", "lifts the arm forward; 0 = folded back, 120 = reaching far out", home=0), Servo("s3", "elbow", "bends the forearm; 140 = tucked in, 0 = fully extended", home=140), Servo("s4", "wrist", "tilts the tip up/down", home=10), ) HOME = tuple(s.home for s in SERVOS) OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-5-mini") OPENAI_REASONING_EFFORT = os.getenv("OPENAI_REASONING_EFFORT", "") STT_LANGUAGE = os.getenv("STT_LANGUAGE", "en-US") BAUD_RATE = int(os.getenv("BAUD_RATE", "9600")) def clamp_pose(pose): return tuple(max(s.lo, min(s.hi, int(round(a)))) for s, a in zip(SERVOS, pose))