# πŸ“Š OpenAI Costs API Integration - Implementation Summary ## Hvad blev implementeret Jeg har integreret OpenAI's **Costs API** endpoint i Tilbudgivern for at tracke AI-omkostninger direkte fra OpenAI og vise dem i "πŸ€– AI Budget" fanen. ## Komponenter ### 1. Backend Service (`/backend/src/services/openaiService.js`) **Nye metoder:** ```javascript // Hent omkostningsdata fra OpenAI API fetchOpenAICosts(daysBack = 30) // Hent detaljeret omkostningsfordeling med gruppering getDetailedCostBreakdown(options = {}) ``` **Features:** - Caching af data (5 min cache) - Fallback til database hvis API fails - Support for gruppering efter line_item og project_id - Pagination support ### 2. Backend Routes (`/backend/src/routes/quotes.js`) **Tre nye API endpoints:** | Endpoint | Metode | FormΓ₯l | |----------|--------|--------| | `/api/quotes/openai/costs` | GET | Hent total omkostninger sidste N dage | | `/api/quotes/openai/costs/breakdown` | GET | Detaljeret fordeling med gruppering | | `/api/quotes/openai/budget/status` | GET | Budgetstatus + advarsler | ### 3. Frontend Updates (`/frontend/src/App.js`) **Nye states:** ```javascript const [openaiCosts, setOpenaiCosts] = useState(null); const [budgetStatus, setBudgetStatus] = useState(null); ``` **Opdateret loadOpenaiUsage()** - Kalder nu alle tre endpoints parallel **UI Components:** - Budget Status Card (med farvet progress bar) - Budget Details (mΓ₯nedligt budget, brugt, tilbage, daglig rate) - Token Limit Status (tokens brugt vs limit) - Cost Breakdown (fordelt pΓ₯ line items og projekter) ### 4. Styling (`/frontend/src/App.css`) **Nye CSS klasser:** - `.budget-status` - Budget status card med color warnings - `.budget-progress-bar` - Progress bar med dynamic farver - `.budget-details` - Budget oversigt - `.token-limit-details` - Token limit oversigt - `.costs-breakdown` - Cost fordeling **Color Scheme:** - 🟒 Green (#28a745) - OK (0-60%) - 🟑 Yellow (#ffc107) - Notice (60-80%) - 🟠 Orange (#ff9800) - Warning (80-95%) - πŸ”΄ Red (#dc3545) - Critical (95%+) ### 5. Configuration **`.env` fil update:** ```properties OPENAI_API_KEY=sk-proj-... # Existing OPENAI_ADMIN_KEY=sk-org-... # NEW - for Costs API ``` ## User Flow 1. **Autentificering** β†’ User logger in 2. **AI Budget Tab** β†’ Bruger klikker pΓ₯ "πŸ€– AI Budget" 3. **Data Load** β†’ System kalder alle tre endpoints parallel 4. **Visning:** - Token stats fra database (altid tilgΓ¦ngelig) - Budget status fra OpenAI API (hvis OPENAI_ADMIN_KEY sat) - Cost breakdown fra OpenAI API (hvis OPENAI_ADMIN_KEY sat) 5. **Advarsler** β†’ Hvis budget > 80%, vises warning ## Data Flow ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Frontend (App.js) β”‚ β”‚ - Click "πŸ€– AI Budget" β”‚ β”‚ - Call loadOpenaiUsage() β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β–Ό β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚/stats β”‚ β”‚/costs β”‚ β”‚/budget β”‚ β”‚(DB) β”‚ β”‚(OpenAI) β”‚ β”‚/status β”‚ β”‚ β”‚ β”‚ β”‚ β”‚(OpenAI) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ React State β”‚ β”‚ - openaiUsage β”‚ β”‚ - openaiCosts β”‚ β”‚ - budgetStatus β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Render UI Components: β”‚ β”‚ - Stats Cards β”‚ β”‚ - Budget Status β”‚ β”‚ - Progress Bars β”‚ β”‚ - Cost Breakdown β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## OpenAI API Integration **Query til OpenAI Costs API:** ```bash GET https://api.openai.com/v1/organization/costs?start_time=1730419200&limit=1 \ -H "Authorization: Bearer $OPENAI_ADMIN_KEY" \ -H "Content-Type: application/json" ``` **Response struktur:** ```json { "object": "page", "data": [ { "object": "bucket", "start_time": 1730419200, "end_time": 1730505600, "results": [ { "object": "organization.costs.result", "amount": { "value": 0.06, "currency": "usd" }, "line_item": "Language models", "project_id": "proj_abc" } ] } ], "has_more": false, "next_page": null } ``` ## Files Modified | File | Γ†ndringer | |------|-----------| | `/backend/src/services/openaiService.js` | +2 nye metoder, +fetchOpenAICosts(), +getDetailedCostBreakdown() | | `/backend/src/routes/quotes.js` | +3 nye endpoints for costs, budget status | | `/frontend/src/App.js` | +2 states, updated loadOpenaiUsage(), +UI components | | `/frontend/src/App.css` | +Budget styling, progress bars, color warnings | | `/backend/.env` | +OPENAI_ADMIN_KEY config | | `/docs/OPENAI_COSTS_API.md` | NEW - Full documentation | | `/test_openai_costs_api.sh` | NEW - Test script | ## Setup Checklist - [x] Backend service implementeret - [x] API endpoints tilfΓΈjet - [x] Frontend states tilfΓΈjet - [x] UI komponenter implementeret - [x] CSS styling tilfΓΈjet - [x] .env configuration - [x] Error handling - [x] Documentation - [ ] OPENAI_ADMIN_KEY konfigurering (krΓ¦ves fra bruger) - [ ] Backend restart ## Next Steps **For at fΓ₯ det fuldt ud til at virke:** 1. **FΓ₯ OPENAI_ADMIN_KEY:** - GΓ₯ til https://platform.openai.com/account/org-settings/api-keys - Opret ny "secret key" - SΓΈrg for "Admin" eller "Organization Owner" rolle 2. **SΓ¦t i .env:** ```bash OPENAI_ADMIN_KEY=sk-org-xxxxx ``` 3. **Restart backend:** ```bash npm start ``` 4. **Test:** ```bash ./test_openai_costs_api.sh ``` 5. **Se resultat:** - Γ…bn AI Budget tab - Hvis alt virker, vises budget status + cost breakdown - Hvis OPENAI_ADMIN_KEY ikke er sat, vises kun database stats ## FejlhΓ₯ndtering **Hvis OpenAI API fails:** - Frontend fallback til database stats - Bruger ser "OpenAI Costs API utilgΓ¦ngelig" - System logger fejlen til server logs **Hvis OPENAI_ADMIN_KEY mangler:** - Endpoints returnerer `success: false` - Frontend viser kun token stats fra database - Ingen omkostningsdata fra OpenAI vises ## Performance - **Caching:** 5 minutter (for at spare API calls) - **Parallel requests:** Alle tre endpoints kaldes samtidigt - **Timeout:** 10 sekunder pr request - **Database:** Bruges som fallback + primary source for token stats ## Security - OPENAI_ADMIN_KEY er **aldrig** exposed til frontend - Kun server-side API calls - Key er i .env (ikke i kode) - API requests autentificeres via Authorization header ## Test Resultat Du kan nu: βœ… Se OpenAI costs direkte fra OpenAI's API βœ… Monitore budget forbrug i real-time βœ… Se advarsler nΓ₯r budget > 80% βœ… Analysere costs fordelt pΓ₯ line items og projekter βœ… Estimere dage til budget opbrugt Med denne integration kan du nu **datadrevet administrere ditt OpenAI budget** og tage bedre beslutninger om model valg og API usage!