rowm-polymorphic-notebook / AHMAD_BOT_GUIDE.md
SNAPKITTYWEST's picture
push from SNAPKITTYWEST/rowm-polymorphic-notebook
1d3f990 verified
|
Raw History Blame Contribute Delete
12.6 kB
# Ahmad Bot โ€” Technical Guide
## Overview
Ahmad Bot is a real local LLM assistant embedded in the ROWM Notebook. It uses **@mlc-ai/web-llm** for genuine model inference in your browser, with no API keys or network dependencies.
**Key Features:**
- Real model inference (Llama 2, Mistral, TinyLlama, NeuralHermes)
- WebGPU acceleration when available (CPU fallback)
- Automatic notebook cell extraction and context-aware responses
- Unicode preservation (ฮป ฮฉ ฯ• โˆ‘ ๐ค€ ๊™ฎ)
- Streaming token generation
- Session persistence
- Dark sovereign theme (navy/cyan/gold)
## Architecture
### Files
| File | Purpose | Lines |
|------|---------|-------|
| `scripts/ahmad-bot-engine.js` | Real WebLLM integration, notebook context extraction | 550 |
| `scripts/ahmad-bot-ui.js` | Chat interface, panel management, message handling | 480 |
| `styles/ahmad-bot.css` | Dark theme, animations, responsive layout | 390 |
| `scripts/ahmad-bot-worker.js` | Optional Web Worker for non-blocking inference | 200 |
### Components
#### `NotebookPageReader`
Extracts notebook cells from DOM without reading nav/buttons:
```javascript
// Extract all cells
const cells = NotebookPageReader.extractCells();
// Returns: [{id, index, type, source, output, hash}, ...]
// Get notebook metadata
const meta = NotebookPageReader.getNotebookMetadata();
// Returns: {title, subtitle, cellCount, timestamp}
```
#### `NotebookContextIndex`
Builds searchable index and retrieves relevant cells:
```javascript
const index = new NotebookContextIndex();
// Find relevant cells for a query
const relevant = index.findRelevant("reversible Unicode", 5);
// Get cell by index
const cell = index.getCellByIndex(0);
// Export context as formatted text
const text = index.formatContextAsText(cells);
```
#### `AhmadWebLLMEngine`
Real WebLLM integration with streaming:
```javascript
const engine = new AhmadWebLLMEngine();
// Initialize with model selection
await engine.initialize('Llama-2-7b-chat-hf-q4f32_1-MLC');
// Check if ready
if (engine.isReady()) { ... }
// Generate with notebook context
const systemPrompt = engine.buildSystemPrompt(userMessage);
await engine.generate(userMessage, systemPrompt);
// Listen to events
engine.on('token', (token) => console.log(token));
engine.on('statusChanged', (status) => console.log(status));
engine.on('generationComplete', (response) => console.log(response));
// Interrupt generation
engine.interrupt();
```
#### `AhmadBotUI`
Chat interface and panel management:
```javascript
// Auto-initialized on page load
window.ahmadBotUI
// Programmatic access
window.ahmadBotUI.sendMessage();
window.ahmadBotUI.stopGeneration();
window.ahmadBotUI.clearMessages();
window.ahmadBotUI.updateStatus('READY');
window.ahmadBotUI.openPanel();
window.ahmadBotUI.closePanel();
```
## Model Selection
### Prebuilt Models (Verified)
| Model | Size | Speed | Memory | Best For |
|-------|------|-------|--------|----------|
| Llama 2 7B (q4f32) | 3.9GB | Medium | 8GB+ | Production, quality |
| Mistral 7B (q4f16) | 4.1GB | Fast | 8GB+ | Speed, efficiency |
| NeuralHermes 7B | 4.2GB | Medium | 8GB+ | Technical Q&A |
| TinyLlama 1.1B (q4f16) | 530MB | Very Fast | 2GB+ | Testing, limited devices |
### Selection Flow
```javascript
// List available models
const models = engine.getSupportedModels();
// Returns: [{id, name, size}, ...]
// Initialize specific model
await engine.initialize('Mistral-7B-Instruct-v0.2-q4f16_1-MLC');
// Check WebGPU support
const hasWebGPU = AhmadWebLLMEngine.hasWebGPU();
// CPU fallback automatically used if unavailable
```
## Integration into index-app.html
The following is already integrated. To verify:
1. **CSS is loaded:**
```html
<link rel="stylesheet" href="styles/ahmad-bot.css">
```
2. **WebLLM library is loaded:**
```html
<script src="https://cdn.jsdelivr.net/npm/@mlc-ai/web-llm@0.2.33/lib/web-llm.js"></script>
```
3. **Scripts are loaded in order:**
```html
<script src="scripts/ahmad-bot-engine.js"></script>
<script src="scripts/ahmad-bot-ui.js"></script>
```
4. **DOM elements exist:**
```html
<div id="jit-launcher" class="jit-launcher">
<button id="jit-toggle">ฮฉ</button>
</div>
<div id="jit-panel" class="jit-panel hidden">
<!-- Pre-built UI structure -->
</div>
```
## End-to-End Usage
### 1. Open Notebook
```
โ†’ Navigate to index-app.html
โ†’ Notebook visible with cells
โ†’ ฮฉ button appears in bottom-right corner
```
### 2. Launch Ahmad Bot
```
โ†’ Click ฮฉ button
โ†’ Panel slides open from bottom-right
โ†’ Status: "OFFLINE"
```
### 3. Initialize Model
```
โ†’ First open triggers automatic initialization
โ†’ Status: "LOADING"
โ†’ Real model downloads to browser (~3-4GB for Llama 2)
โ†’ Download progress shown in WebLLM console
โ†’ Status: "READY" when complete
```
### 4. Chat
```
โ†’ Type question: "What does this notebook say about reversible Unicode?"
โ†’ Press Enter or click Send
โ†’ Status: "GENERATING"
โ†’ Tokens stream in real-time (actual model output)
โ†’ Status: "READY" when complete
โ†’ Response cites actual notebook cells
```
### 5. Follow-up
```
โ†’ Ask follow-up question
โ†’ Context preserved from conversation history
โ†’ New response generated with full context
```
### 6. Management
```
โ†’ "Stop" button: Interrupt generation
โ†’ "Clear" button: Clear message history
โ†’ "โˆ’" button: Minimize panel
โ†’ "โœ•" button: Close panel (model stays loaded)
โ†’ Draggable header: Move panel around
```
## System Prompt
The system prompt is built per-message and includes:
1. **Identity:** "You are Ahmad Bot, embedded technical guide for the Isomorphic WORM Notebook"
2. **Environment:** "Running locally in the browser"
3. **Notebook Context:** Relevant cells found via keyword search
4. **Instructions:**
- Answer based on notebook content
- Cite cell identifiers
- Never invent cells
- Preserve Unicode exactly
- Be concise and direct
### Example System Prompt
```
You are Ahmad Bot, an embedded technical guide for the Isomorphic WORM Notebook running locally in the browser.
You have access to the following notebook context:
ROWM Notebook Context
Title: ฮฉ Isomorphic WORM Notebook
Total Cells: 3
===================
Cell [0]
Type: code
Source:
// Reversible Unicode mapping
const reversibleMap = {
'ฮป': 'LAMBDA',
'ฮฉ': 'OMEGA',
'ฯ•': 'PHI'
};
---
[Additional cells...]
Instructions:
- Answer questions based on notebook content
- Cite cell identifiers (e.g., "Cell 0", "Cell 1")
- Never invent cells or content
- Preserve Unicode exactly (ฮป ฮฉ ฯ• โˆ‘ ๐ค€ ๊™ฎ)
- Be concise and direct
- If uncertain about content, say so
User question: What does this notebook say about reversible Unicode?
```
## Status States
| State | Color | Animation | Meaning |
|-------|-------|-----------|---------|
| OFFLINE | Gray | None | Model not loaded |
| LOADING | Blue | Pulse | Downloading/initializing model |
| READY | Green | None | Model ready, waiting for input |
| GENERATING | Cyan | Pulse | Model producing response |
| ERROR | Red | None | Error occurred |
## Event Listeners
```javascript
// Engine events
engine.on('statusChanged', (status) => { ... })
engine.on('token', (token) => { ... })
engine.on('generationStart', () => { ... })
engine.on('generationComplete', (response) => { ... })
engine.on('generationStopped', () => { ... })
engine.on('error', (error) => { ... })
engine.on('historyCleared', () => { ... })
```
## Performance
### Download Sizes (One-time)
- Llama 2 7B: ~3.9GB (15-20 min on good connection)
- Mistral 7B: ~4.1GB (15-20 min)
- TinyLlama 1.1B: ~530MB (2-3 min)
### First Token Latency
- **WebGPU (NVIDIA RTX 3080+):** 300-500ms
- **WebGPU (AMD RDNA):** 500-800ms
- **CPU (i7-12700K):** 2-4 seconds
### Token Generation Speed
- **WebGPU:** 5-10 tokens/second
- **CPU:** 1-2 tokens/second
### Memory Footprint
- Runtime: 1-2GB (model-dependent)
- Browser overhead: 500MB-1GB
- Recommendation: 8GB+ for 7B models
## Troubleshooting
### Model Won't Initialize
**Symptom:** Status stays "LOADING" or shows "ERROR"
**Solutions:**
1. Check browser console for errors: `F12 โ†’ Console`
2. Verify WebLLM is loaded: `console.log(window.webllm)`
3. Check browser supports WebGPU or WebAssembly:
```javascript
navigator.gpu // WebGPU
typeof WebAssembly // WebAssembly
```
4. Try smaller model (TinyLlama) first
5. Clear browser cache and reload
### Model Downloads Slowly
**Solutions:**
1. Check internet connection speed
2. Look at browser Network tab to see download progress
3. Models cache in IndexedDB after first download
4. Try CDN-cached model (auto-retried by WebLLM)
### Responses Are Short/Cut Off
**Check:**
1. `maxTokens` setting (default: 512)
2. If model reached token limit: `model.maxTokens = 1024`
3. Model may have input token limit based on history
### GPU Not Used
**Check:**
1. Is GPU available? `AhmadWebLLMEngine.hasWebGPU()`
2. Browser console shows "Using GPU" or "Using CPU"
3. Some browsers/GPUs may force CPU mode
4. Performance acceptable on CPU is normal
### Unicode Not Preserved
**Cause:** Token sanitization too aggressive
**Fix:** `ahmad-bot-ui.js` line ~240 only removes control characters, preserves Unicode:
```javascript
sanitizeToken(token) {
return token.replace(/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/g, '');
}
```
## Testing
### Automated End-to-End Test
```javascript
// 1. Check components are loaded
console.log('Engine loaded:', typeof AhmadWebLLMEngine)
console.log('UI loaded:', typeof AhmadBotUI)
// 2. Check DOM elements
console.log('Launcher:', document.getElementById('jit-launcher'))
console.log('Panel:', document.getElementById('jit-panel'))
// 3. Open panel
window.ahmadBotUI.openPanel()
// 4. Wait for model (check status in UI)
// Status should change: OFFLINE โ†’ LOADING โ†’ READY
// 5. Send test message
document.getElementById('jit-input').value = 'What cells are in this notebook?'
window.ahmadBotUI.sendMessage()
// 6. Observe real tokens streaming
// Panel should show message from model with actual cells cited
```
### Manual Testing Checklist
- [ ] Page loads, notebook visible
- [ ] ฮฉ button visible bottom-right, pulsing cyan
- [ ] Click ฮฉ button โ†’ panel slides open
- [ ] Status shows "OFFLINE" โ†’ "LOADING"
- [ ] Panel shows download progress or message
- [ ] After 5-20 minutes: status shows "READY"
- [ ] Type question, press Enter
- [ ] Status changes to "GENERATING"
- [ ] Tokens appear real-time in chat
- [ ] Response cites actual notebook cells
- [ ] Stop button works mid-generation
- [ ] Clear button empties chat
- [ ] Minimize button collapses panel to header
- [ ] Can drag panel by header
- [ ] Reload page โ†’ model cached, loads faster
- [ ] Mobile: panel responsive at 95vw
## Security & Privacy
โœ… **All inference runs locally** โ€” No data sent to servers
โœ… **No API keys required** โ€” Model runs in browser
โœ… **No telemetry** โ€” WebLLM may report model usage (optional)
โœ… **Notebook content never leaves browser** โ€” Context built locally
โœ… **Token generation** โ€” Pure model output, no filtering/modification
## Unicode Support
Preserved exactly across all components:
```
ฮป (Lambda) โ€” Greek letter
ฮฉ (Omega) โ€” Greek letter
ฯ• (Phi) โ€” Mathematical symbol
โˆ‘ (Summation) โ€” Mathematical operator
๐ค€ (Samaritan) โ€” Ancient script
๊™ฎ (Old Cyrillic) โ€” Historical script
โ†’ โ† โ†‘ โ†“ โ€” Arrows
โˆž โˆ… โŠ‚ โŠƒ โ€” Set notation
```
All preserved in:
1. Notebook cell extraction
2. Context indexing
3. System prompt building
4. Token streaming
5. Message display
## Future Enhancements
- Multi-turn fine-tuning corpus
- Notebook cell execution proposals
- WORM receipt signing for responses
- Model comparison UI
- Voice input/output
- Custom system prompts
- Response export
## Support
For issues:
1. Check browser console: `F12 โ†’ Console`
2. Verify WebLLM loaded: `console.log(window.webllm)`
3. Check network: No CORS errors
4. Try different model if error persists
5. File issue with console output
---
**Ahmad Bot** โ€” Embedded AI for the Reversible World Ontology Math Notebook