adi-models-lab / app.js
ritterkraft's picture
Add Qwen3.5 9B model to selector
431411f verified
Raw
History Blame Contribute Delete
6.86 kB
const canvas = document.getElementById("field");
const ctx = canvas.getContext("2d");
const prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
let width = 0;
let height = 0;
let particles = [];
function resize() {
const dpr = Math.min(window.devicePixelRatio || 1, 2);
width = window.innerWidth;
height = window.innerHeight;
canvas.width = Math.floor(width * dpr);
canvas.height = Math.floor(height * dpr);
canvas.style.width = `${width}px`;
canvas.style.height = `${height}px`;
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
const count = Math.max(48, Math.min(120, Math.floor(width / 13)));
particles = Array.from({ length: count }, () => ({
x: Math.random() * width,
y: Math.random() * height,
z: Math.random() * 1 + 0.35,
vx: (Math.random() - 0.5) * 0.28,
vy: (Math.random() - 0.5) * 0.18,
}));
}
function draw() {
ctx.clearRect(0, 0, width, height);
ctx.fillStyle = "rgba(2,4,5,0.22)";
ctx.fillRect(0, 0, width, height);
for (const p of particles) {
if (!prefersReduced) {
p.x += p.vx * p.z;
p.y += p.vy * p.z;
if (p.x < -20) p.x = width + 20;
if (p.x > width + 20) p.x = -20;
if (p.y < -20) p.y = height + 20;
if (p.y > height + 20) p.y = -20;
}
ctx.beginPath();
ctx.fillStyle = `rgba(37,247,196,${0.10 + p.z * 0.18})`;
ctx.arc(p.x, p.y, 1.2 * p.z, 0, Math.PI * 2);
ctx.fill();
}
for (let i = 0; i < particles.length; i++) {
for (let j = i + 1; j < particles.length; j++) {
const a = particles[i];
const b = particles[j];
const dx = a.x - b.x;
const dy = a.y - b.y;
const dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 120) {
ctx.strokeStyle = `rgba(91,211,255,${(1 - dist / 120) * 0.11})`;
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(a.x, a.y);
ctx.lineTo(b.x, b.y);
ctx.stroke();
}
}
}
requestAnimationFrame(draw);
}
const lines = [
"$ ollama run hf.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF:Q4_K_M",
"loading gguf shards...",
"teacher imprint: glm-5.2",
"context window: long",
"mode: local-first",
"ready: ask ADI anything"
];
const typeout = document.getElementById("typeout");
let char = 0;
let text = "";
function typeLoop() {
const full = lines.join("\n");
text = full.slice(0, char);
typeout.textContent = text + (char % 2 ? "█" : "");
char = char >= full.length ? 0 : char + 1;
setTimeout(typeLoop, char === 0 ? 900 : 32);
}
const models = {
qwen35: {
kind: "general assistant",
name: "adi-qwen3.5-4b-glm5.2-general",
body: "The smallest flagship ADI general model: distilled from glm-5.2 for practical local reasoning, explanation, and tool-aware chat.",
command: "ollama run hf.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF:Q4_K_M",
link: "https://huggingface.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF"
},
qwen359: {
kind: "general assistant",
name: "adi-qwen3.5-9b-glm5.2-general",
body: "A larger Qwen3.5 general student with more reasoning headroom while keeping the ADI local-first distillation style.",
command: "hf.co/AdvancedDataIntelligence/adi-qwen3.5-9b-glm5.2-general-GGUF",
link: "https://huggingface.co/AdvancedDataIntelligence/adi-qwen3.5-9b-glm5.2-general-GGUF"
},
qwen3: {
kind: "general assistant",
name: "adi-qwen3-8b-glm5.2-general",
body: "More headroom for general reasoning while staying within a practical single-machine local inference envelope.",
command: "ollama run hf.co/AdvancedDataIntelligence/adi-qwen3-8b-glm5.2-general-GGUF:Q4_K_M",
link: "https://huggingface.co/AdvancedDataIntelligence/adi-qwen3-8b-glm5.2-general-GGUF"
},
coder: {
kind: "coding assistant",
name: "adi-qwen2.5-coder-7b-kimi2.7-code",
body: "A local coding model distilled from a frontier code teacher for generation, debugging, refactoring, and explanation.",
command: "ollama run hf.co/AdvancedDataIntelligence/adi-qwen2.5-coder-7b-kimi2.7-code-GGUF:Q4_K_M",
link: "https://huggingface.co/AdvancedDataIntelligence/adi-qwen2.5-coder-7b-kimi2.7-code-GGUF"
},
wake: {
kind: "voice interface",
name: "hey-adi-wakeword",
body: "A wakeword model for hands-free ADI loops, pairing local intelligence with ambient interaction.",
command: "hf.co/AdvancedDataIntelligence/hey-adi-wakeword",
link: "https://huggingface.co/AdvancedDataIntelligence/hey-adi-wakeword"
}
};
const kind = document.getElementById("model-kind");
const name = document.getElementById("model-name");
const body = document.getElementById("model-body");
const command = document.getElementById("model-command");
const link = document.getElementById("model-link");
const toast = document.getElementById("toast");
document.querySelectorAll(".tab").forEach((tab) => {
tab.addEventListener("click", () => {
document.querySelectorAll(".tab").forEach((item) => item.classList.toggle("active", item === tab));
const model = models[tab.dataset.model];
kind.textContent = model.kind;
name.textContent = model.name;
body.textContent = model.body;
command.textContent = model.command;
link.href = model.link;
});
});
document.getElementById("copy-command").addEventListener("click", async () => {
await navigator.clipboard.writeText(command.textContent);
toast.classList.add("show");
clearTimeout(window.toastTimer);
window.toastTimer = setTimeout(() => toast.classList.remove("show"), 1500);
});
const connectPrompt = document.getElementById("connect-prompt");
const connectAudio = document.getElementById("connect-audio");
const connectContinue = document.getElementById("connect-continue");
const connectClose = document.getElementById("connect-close");
const connectStay = document.getElementById("connect-stay");
document.querySelectorAll(".connect-link").forEach((link) => {
link.addEventListener("click", async (event) => {
event.preventDefault();
connectContinue.href = link.href;
connectPrompt.hidden = false;
connectAudio.currentTime = 0;
try {
await connectAudio.play();
} catch {
toast.textContent = "Tap Open link when ready";
toast.classList.add("show");
clearTimeout(window.toastTimer);
window.toastTimer = setTimeout(() => toast.classList.remove("show"), 1500);
}
});
});
function closeConnectPrompt() {
connectPrompt.hidden = true;
connectAudio.pause();
connectAudio.currentTime = 0;
}
connectClose.addEventListener("click", closeConnectPrompt);
connectStay.addEventListener("click", closeConnectPrompt);
connectPrompt.addEventListener("click", (event) => {
if (event.target === connectPrompt) closeConnectPrompt();
});
window.addEventListener("resize", resize);
resize();
draw();
typeLoop();