Skip to content
This repository was archived by the owner on Aug 21, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions _layouts/default.html
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@
Last updated: {{ page.last_updated }}
</p>
{% endif %}
<script src="{{ '/assets/gpt5.js' | relative_url }}?v=2" defer></script>
<script src="{{ '/assets/gpt5-actions.js' | relative_url }}?v=1" defer></script>


</main>
{% include footer.html %}
Expand Down
67 changes: 67 additions & 0 deletions assets/gpt5-actions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// ES5-safe helpers that use window.gpt5 (from /assets/gpt5.js)
(function () {
if (!window.gpt5) {
console.error("gpt5 helper not found. Include /assets/gpt5.js first.");
return;
}

function $(id) { return document.getElementById(id); }

function textFromPage() {
var el =
document.querySelector("main") ||
document.querySelector("article") ||
document.querySelector(".content") ||
document.querySelector(".post-content") ||
document.getElementById("content") ||
document.body;
var t = el && (el.innerText || el.textContent) || "";
t = (t || "").replace(/\s+/g, " ").trim();
if (t.length > 6000) t = t.slice(0, 6000); // keep the demo snappy
return t;
}

function setBtn(disabled, label) {
var b = $("ai-summary-btn");
if (b) {
b.disabled = !!disabled;
if (label != null) b.textContent = label;
}
}

document.addEventListener("DOMContentLoaded", function () {
var btn = $("ai-summary-btn");
var out = $("ai-summary");
if (!btn || !out) return;

btn.addEventListener("click", function () {
var content = textFromPage();
if (!content) {
out.textContent = "Sorry—no readable content found on this page.";
return;
}

out.textContent = "Thinking…";
setBtn(true, "Summarizing…");
var full = "";

gpt5.stream({
system:
"You are LLbot for OraDigit.com. Summarize for executives and prospects. 5–7 bullet points. Clear, concrete, jargon-light.",
messages: [{
role: "user",
content: "Summarize this page for a prospective client:\n\n" + content
}],
onToken: function (t) {
full += t;
out.textContent = full;
}
})
.then(function () { setBtn(false, "AI Summary"); })
.catch(function (e) {
out.textContent = "Error: " + (e && e.message ? e.message : e);
setBtn(false, "AI Summary");
});
});
});
})();
87 changes: 87 additions & 0 deletions assets/gpt5.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Minimal client for OraDigit's GPT proxy (SSE). ES5-compatible (no spread / optional chaining).
(function () {
var API = "https://auth.oradigit.com/api/chat"; // mapped to chat5

function stream(opts) {
if (!opts) opts = {};
if (!Array.isArray(opts.messages)) throw new Error("messages[] required");

var payload = { messages: opts.messages };
if (opts.system) payload.system = opts.system;
if (opts.model) payload.model = opts.model;

var controller = new AbortController();
var useSignal = opts.signal || controller.signal;

return fetch(API, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
signal: useSignal
}).then(function (resp) {
var ct = resp.headers.get("content-type");
if (!resp.ok) {
return resp.text().then(function (txt) {
try { var j = JSON.parse(txt); throw new Error(j.error || j.message || ("HTTP " + resp.status)); }
catch (e) { throw new Error(txt || ("HTTP " + resp.status)); }
});
}

// If SSE, parse events
if (ct && ct.indexOf("text/event-stream") !== -1) {
var reader = resp.body.getReader();
var decoder = new TextDecoder();
var buffer = "";
var full = "";

function pump() {
return reader.read().then(function (r) {
if (r.done) return full;

buffer += decoder.decode(r.value, { stream: true });
var parts = buffer.split("\n\n");
buffer = parts.pop() || "";

for (var i = 0; i < parts.length; i++) {
var evt = parts[i];
if (!evt.trim()) continue;
var lines = evt.split("\n");
var type = (lines[0] || "").replace(/^event:\s*/, "").trim();
var data = (lines.slice(1).join("\n") || "").replace(/^data:\s*/, "");

if (type === "message") {
full += data;
if (typeof opts.onToken === "function") opts.onToken(data);
} else if (type === "error") {
try { var j = JSON.parse(data); throw new Error(j.message || "Server error"); }
catch (e) { throw new Error("Server error"); }
}
// ignore: open/info/done (informational)
}
return pump();
});
}
return pump();
}

// Non-SSE fallback (shouldn’t happen now)
return resp.json().then(function (json) {
if (json && json.error) throw new Error(json.error);
return json;
})["catch"](function () { return {}; });
});
}

function ask(prompt, opts) {
opts = opts || {};
return stream({
system: opts.system || "You are LLbot for OraDigit.com. Be concise.",
model: opts.model,
messages: [{ role: "user", content: prompt }],
onToken: opts.onToken,
signal: opts.signal
});
}

window.gpt5 = { stream: stream, ask: ask };
})();
4 changes: 4 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,10 @@ <h3>Manage Your Cookie Preferences</h3>
}
});
</script>
<div class="ai-summary-card">
<button id="ai-summary-btn" type="button">AI Summary</button>
<div id="ai-summary" aria-live="polite"></div>
</div>


<!-- Cookie Script -->
Expand Down