--- id: ML-32 title: OpenAI API uses unsafe bang methods and lacks rate limiting status: Done assignee: [] created_date: "2026-04-20 08:52" labels: [] dependencies: [] references: - "https://github.com/cloud8421/music_library/issues/147" priority: high --- ## Description _GitHub: created 2026-04-05 · updated 2026-04-05 · closed 2026-04-05_ ## Summary The OpenAI API client is the only integration that uses `Req.post!()` (bang methods) which raise on failure instead of returning error tuples. It also lacks rate limiting, breaking the pattern established by all other API integrations. ## Why This Matters - `Req.post!()` raises on HTTP errors instead of returning `{:error, reason}` tuples, risking unhandled crashes in production - Every other API client (MusicBrainz, Last.fm, Discogs, Wikipedia, Brave Search) attaches `Req.RateLimiter` — OpenAI does not - `OpenAI.Config` is missing the `api_cooldown` field present in all other Config modules - This is the only integration that breaks the three-module pattern (Facade/API/Config) ## Affected Files - `lib/open_ai/api.ex` (lines 20, 79 — `Req.post!()` calls) - `lib/open_ai/config.ex` (missing `api_cooldown` field) ## Suggested Fix 1. Replace `Req.post!()` with `Req.post()` and handle error tuples 2. Add `api_cooldown` to `OpenAI.Config` 3. Attach `Req.RateLimiter` in the request pipeline ## Acceptance Criteria - OpenAI API calls return `{:ok, _}` / `{:error, _}` tuples like all other integrations - Rate limiter is attached with a configurable cooldown - `OpenAI.Config` follows the same structure as other API Config modules - [ ] #1 OpenAI API calls return `{:ok, _}` / `{:error, _}` tuples like all other integrations - [ ] #2 Rate limiter is attached with a configurable cooldown - [ ] #3 `OpenAI.Config` follows the same structure as other API Config modules