# 🧠 HALE API Integration Guide (Next.js, Flutter, React, Mobile) Welcome! This guide outlines how to integrate the HALE (Adaptive Learning Engine) backend into any frontend application. The HALE backend is a production-grade FastAPI app with a Reinforcement Learning engine that dynamically customizes study plans. --- ## 🌐 Server Details - **Production API URL**: `https://raunak211006-hale-api.hf.space` - **Swagger Documentation**: `https://raunak211006-hale-api.hf.space/docs` - **Response Format**: JSON only. - **Authentication**: JWT Bearer token in headers: `Authorization: Bearer ` --- ## 🔄 The Complete Lifecycle Flow To build a seamless interface, your frontend should follow this logical flow: ```mermaid graph TD A[1. Auth: Login/Register] -->|JWT Token| B[2. Setup: Create Goals & Timetable] B --> C[3. Daily Plan: Fetch Today's Tasks] C -->|If tasks pending| D[4. Work: Complete Tasks & Update State] D -->|Award XP + RL Reward| C C -->|If all tasks done| E[5. Day Close: Done for Today] E -->|Unlock Next Day Preview| F[6. Next Day Preview] ``` --- ## 🛠️ Step-by-Step Implementation ### 1. Authentication (Login & JWT Store) Save the `access_token` and `refresh_token` in `localStorage`, `secure_store`, or cookies. #### Request Example (Javascript/Typescript): ```typescript const API_URL = "https://raunak211006-hale-api.hf.space"; // 1. Register User async function registerUser(userId: string, password: string, email?: string) { const res = await fetch(`${API_URL}/api/auth/register`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ user_id: userId, password, email }) }); return res.json(); } // 2. Login User async function loginUser(userId: string, password: string) { const res = await fetch(`${API_URL}/api/auth/login`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ user_id: userId, password }) }); const data = await res.json(); // returns { access_token, refresh_token } if (data.access_token) { localStorage.setItem("access_token", data.access_token); localStorage.setItem("refresh_token", data.refresh_token); } return data; } ``` --- ### 2. Authenticated Fetch Helper Use this helper to automatically inject the Bearer token into all headers: ```typescript async function fetchWithAuth(endpoint: string, options: RequestInit = {}) { const token = localStorage.getItem("access_token"); const headers = { "Content-Type": "application/json", ...(token ? { "Authorization": `Bearer ${token}` } : {}), ...options.headers, }; const response = await fetch(`${API_URL}${endpoint}`, { ...options, headers }); if (response.status === 401) { // Handle expired token: refresh token logic goes here console.error("Session expired. Redirect to login."); } return response.json(); } ``` --- ### 3. Create a Learning Goal Curriculum plans are generated by Gemini AI instantly based on the prompt. ```typescript async function createGoal(goalText: string, days = 30, priority = 1) { return fetchWithAuth("/api/goals/", { method: "POST", body: JSON.stringify({ goal: goalText, // e.g. "Master React and Typescript" duration_days: days, priority: priority // Higher priority (1) gets more study allocation }) }); } ``` --- ### 4. Fetch the Daily Plan This returns today's tasks and the Reinforcement Learning behavior engine's state parameters. ```typescript async function getDailyPlan() { return fetchWithAuth("/api/plan"); } ``` #### JSON Response Schema: ```json { "date": "2026-05-21", "tasks": [ "Core: Learn JSX Syntax (~40 min)" ], "tasks_detail": [ { "type": "core", "title": "Learn JSX Syntax", "est_min": 40, "deliverable": "Build static portfolio header", "goal_id": 1, "goal_label": "React.js Mastery", "date": "2026-05-21" } ], "behavior": { "action_label": "Normal", "intensity": 0.65, "mood": 0.8, "fatigue": 0.1, "cold_start": false, "plateau_detected": false }, "coach_message": "Awesome energy today! Let's conquer this first React building block.", "streak": 5, "total_minutes": 40, "goals_count": 1, "next_day_preview": null } ``` --- ### 5. Mark a Task Complete (Triggers RL reward) When completing a task, the RL engine modifies user parameters (`alpha`/`beta` parameters) based on task duration and subjective satisfaction. ```typescript async function completeTask(date: string, goalId: number, durationMin: number, satisfaction: number) { return fetchWithAuth("/api/complete-task", { method: "POST", body: JSON.stringify({ date: date, // YYYY-MM-DD from tasks_detail goal_id: goalId, // goal_id from tasks_detail actual_duration_min: durationMin, satisfaction: satisfaction, // Float between 0.0 (hated it) to 1.0 (loved it) notes: "Completed all code challenges!" }) }); } ``` *Note: If `all_completed` is returned as `true` in the response, you can immediately notify the user and transition them to the next day's preview.* --- ### 6. Done For Today (Close Day Manually) Forces manual closure of the day. All remaining tasks are completed, streak counts are updated, and the **Next Day's Preview** is generated. ```typescript async function closeDay() { return fetchWithAuth("/api/day/complete", { method: "POST" }); } ``` #### Day Close Response Sample: ```json { "closed": 1, "message": "Day closed. 1 task(s) marked as done.", "date": "2026-05-21", "streak": 6, "xp_gained": 15, "total_xp": 450, "level": 3, "leveled_up": false, "next_day_preview": { "action_label": "Deep Work", "intensity": 0.85, "preview": true } } ``` --- ### 7. Get Tomorrow's Preview Explicitly Fetch a preview of tomorrow's focus and adaptive intensity without actually progressing the current state. ```typescript async function getNextDayPreview() { return fetchWithAuth("/api/plan/next"); } ``` --- ## ⚡ Real-Time Adaptive Feedback State You should allow the user to input their behavioral metrics periodically (e.g., mood, fatigue, sleep quality). This recalibrates the Reinforcement Learning engine instantly: ```typescript async function updateBehaviorState(mood: number, fatigue: number, stress: number, sleepQuality: number) { return fetchWithAuth("/api/update-state", { method: "POST", body: JSON.stringify({ mood: mood, // 0.0 to 1.0 fatigue: fatigue, // 0.0 to 1.0 stress: stress, // 0.0 to 1.0 sleep_quality: sleepQuality // 0.0 to 1.0 }) }); } ``` *Call this when a user changes their status slider. The next call to `/api/plan` will return adapted durations based on these metrics.* --- ## 📊 Summary Table of API Endpoints | Resource | HTTP Method | Endpoint | Description | |---|---|---|---| | **Auth** | `POST` | `/api/auth/register` | Register new user | | **Auth** | `POST` | `/api/auth/login` | Login and get tokens | | **Goals** | `POST` | `/api/goals/` | Create a goal with AI syllabus | | **Goals** | `GET` | `/api/goals/` | List user goals | | **Daily Plan** | `GET` | `/api/plan` | Fetch current adaptive daily tasks | | **Tasks** | `POST` | `/api/complete-task` | Mark task completed (awards XP/RL) | | **Tasks** | `POST` | `/api/skip-task` | Skip a task | | **Lifecycle** | `POST` | `/api/day/complete` | Complete day & generate next preview | | **Lifecycle** | `GET` | `/api/plan/next` | Preview tomorrow's focus | | **Lifecycle** | `GET` | `/api/day/status` | Today's completion details | | **Analytics** | `GET` | `/api/stats` | Gamification stats (level, XP, streaks) | | **Behavior** | `POST` | `/api/update-state` | Update mood/fatigue to adapt engine | --- ## 🛡️ Production Security Checklist 1. Always keep the Hugging Face `SECRET_KEY` secret. 2. In production, always set the connection string `DATABASE_URL` to the Neon PostgreSQL cluster. 3. CORS configuration allows `*` by default for testing. You can restrict it in Space Settings to only allow your domain (e.g. `https://my-lifeos-app.vercel.app`).