diff --git a/index.html b/index.html index 6d76fef..8b6bd53 100644 --- a/index.html +++ b/index.html @@ -213,6 +213,60 @@ }; } + function safeJsonStringify(v) { + try { return JSON.stringify(v); } catch (_) { return String(v); } + } + + function extractApiErrorDetails(payload) { + if (!payload) return ''; + var err = payload.error || payload; + var parts = []; + + if (typeof err === 'string') parts.push(err); + if (err && typeof err.message === 'string') parts.push(err.message); + if (err && typeof err.code === 'string') parts.push('code: ' + err.code); + if (err && typeof err.type === 'string') parts.push('type: ' + err.type); + + if (err && err.metadata) { + var md = err.metadata; + if (md.provider_name) parts.push('provider: ' + md.provider_name); + if (md.raw && typeof md.raw === 'string') parts.push(md.raw); + if (md.reason) parts.push(md.reason); + } + + if (err && err.details) { + if (typeof err.details === 'string') parts.push(err.details); + else parts.push(safeJsonStringify(err.details)); + } + + if (!parts.length) return ''; + var seen = {}; + var deduped = []; + for (var i = 0; i < parts.length; i++) { + var p = (parts[i] || '').trim(); + if (!p || seen[p]) continue; + seen[p] = true; + deduped.push(p); + } + return deduped.join(' | '); + } + + function parseErrorResponse(res) { + return res.text().then(function(raw) { + var json = null; + if (raw) { + try { json = JSON.parse(raw); } catch (_) {} + } + + var detail = extractApiErrorDetails(json); + if (!detail && raw) detail = raw.trim(); + if (!detail) detail = 'Unknown API error'; + + var statusPart = 'HTTP ' + res.status + (res.statusText ? ' ' + res.statusText : ''); + return statusPart + ' — ' + detail; + }); + } + function generateFrame(opts) { var model = opts.model; var messages = opts.messages; @@ -246,9 +300,7 @@ }) .then(function(res) { if (!res.ok) { - return res.json().catch(function() { return {}; }).then(function(e) { - throw new Error((e && e.error && e.error.message) || 'API error ' + res.status); - }); + return parseErrorResponse(res).then(function(msg) { throw new Error(msg); }); } return res.json(); }) @@ -408,7 +460,8 @@ setProgress(100, 'done! 🎉'); }) .catch(function(err) { - setProgress(0, 'error: ' + err.message); + var msg = (err && err.message) ? err.message : String(err); + setProgress(0, 'error: ' + msg); console.error('vibegif error:', err); }) .then(function() {