3.6 KiB
AI Write Debugging Guide
The AI Write feature has multiple call sites with different element IDs, and several silent-failure modes. Use this guide when "AI Write does nothing."
Call sites (3 locations, different element IDs)
| Function | Button ID | Explanation ID | Notes ID |
|---|---|---|---|
setupCustomServiceModalEventListeners() |
custom-service-ai-write-btn |
custom-service-explanation |
custom-service-technician-notes |
setupServiceEditEventListeners() (inline modal) |
ai-write-btn-quote |
service-edit-explanation-quote |
service-edit-technician-notes-quote |
Settings setupServiceEventListeners() |
ai-write-btn-settings |
service-edit-explanation-settings |
service-edit-technician-notes |
Common failure modes
1. Element ID mismatch
The handler looks for one ID but the HTML has a different suffix. Always use
|| fallback chains that include ALL possible ID variants:
const btn = document.getElementById('ai-write-btn-main')
|| document.getElementById('ai-write-btn-fallback')
|| document.getElementById('ai-write-btn-quote');
2. Duplicate event listeners (race condition)
setupServiceEditEventListeners() was called every time the modal opened,
accumulating click handlers via addEventListener(). After 3 opens, clicking
AI Write fired 4 simultaneous API calls. Fix: guard with attribute.
if (modal.hasAttribute('data-edit-event-listeners-attached')) return;
modal.setAttribute('data-edit-event-listeners-attached', 'true');
3. FormValidator blocks save silently
FormValidator initialized with wrong IDs → validateForm() always false →
saveServiceEdit() never called. No error shown. Fix: call saveServiceEdit()
directly.
4. LLM ignores technician notes
The notes were sent to the LLM but the prompt never told it to use them. Fix: put notes in the system prompt body with a prominent header AND add explicit numbered instructions.
5. explanationTextarea vs explTextarea typo
Variable defined as explanationTextarea but used as explTextarea at one
call site. ReferenceError — caught by the catch block, shows generic error.
6. Custom service modal AI Write missing technician notes / vehicle context
setupCustomServiceModalEventListeners() calls handleAiWrite(nameInput, recInput, explTextarea, aiWriteBtn) — only 4 args. Missing:
- 5th arg:
technicianNotesEl(thecustom-service-technician-notestextarea) - 6th arg:
vehicleContextobject with vehicleInfo and mileage
Without these, the LLM prompt never includes "Technician's internal notes:" or "Vehicle:" / "Current mileage:" context. The AI writes generic explanations instead of incorporating the technician's specific observations.
Fix: Match the edit-service call site pattern:
const technicianNotesEl = document.getElementById('custom-service-technician-notes');
const vehicleCtx = {
vehicleInfo: document.getElementById('vehicleInfo')?.value || '',
mileage: document.getElementById('mileage')?.value || '',
maintenanceInterval: null
};
await handleAiWrite(nameInput, recInput, explTextarea, aiWriteBtn, technicianNotesEl, vehicleCtx);
Diagnostic checklist
grep -n "ai-write-btn" repair-orders.html— verify button ID exists- Check console for "Missing required elements for AI Write" log
- Check if
handleAiWriteis actually imported (line 5 of quote-tab-manager.js) - Verify the LLM endpoint is reachable:
curl -sk https://localhost/llm/v1/chat/completions - Check nginx error log for 403 on shared modules