s
This commit is contained in:
@@ -49,15 +49,14 @@
|
||||
<div class="sidebar">
|
||||
<h3 class="fw-extrabold mb-3"><i class="fas fa-bolt text-primary"></i> NUTRI ELITE</h3>
|
||||
<div class="row g-2">
|
||||
<div class="col-6"><label class="label-pro" id="txtW">Weight</label><input type="number" id="w" class="form-control glass-input" placeholder="--" oninput="update()"></div>
|
||||
<div class="col-6"><label class="label-pro" id="txtT">Target</label><input type="number" id="t" class="form-control glass-input" placeholder="--" oninput="update()"></div>
|
||||
<div class="col-6"><label class="label-pro" id="txtH">Height</label><input type="number" id="h" class="form-control glass-input" placeholder="--" oninput="update()"></div>
|
||||
<div class="col-6"><label class="label-pro">Age</label><input type="number" id="age" class="form-control glass-input" placeholder="--" oninput="update()"></div>
|
||||
<div class="col-6"><label class="label-pro" id="txtW">Weight (kg)</label><input type="number" id="w" class="form-control glass-input" value="110" oninput="update()"></div>
|
||||
<div class="col-6"><label class="label-pro" id="txtT">Target (kg)</label><input type="number" id="t" class="form-control glass-input" value="85" oninput="update()"></div>
|
||||
<div class="col-6"><label class="label-pro" id="txtH">Height (cm)</label><input type="number" id="h" class="form-control glass-input" value="176" oninput="update()"></div>
|
||||
<div class="col-6"><label class="label-pro">Age</label><input type="number" id="age" class="form-control glass-input" value="30" oninput="update()"></div>
|
||||
<div class="col-12">
|
||||
<label class="label-pro">Activity</label>
|
||||
<select id="act" class="form-select glass-input" onchange="update()">
|
||||
<option value="" disabled selected>Select activity...</option>
|
||||
<option value="1.2">Sedentary</option>
|
||||
<option value="1.2" selected>Sedentary</option>
|
||||
<option value="1.375">Lightly Active</option>
|
||||
<option value="1.55">Moderately Active</option>
|
||||
<option value="1.725">Very Active</option>
|
||||
@@ -65,21 +64,21 @@
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label class="label-pro d-flex justify-content-between">Adjustment <span id="aggDisp">0 kcal</span></label>
|
||||
<input type="range" id="agg" class="form-range" min="-1000" max="1000" step="50" value="0" oninput="update()">
|
||||
<label class="label-pro d-flex justify-content-between">Adjustment <span id="aggDisp">-300 kcal</span></label>
|
||||
<input type="range" id="agg" class="form-range" min="-1000" max="1000" step="50" value="-300" oninput="update()">
|
||||
</div>
|
||||
</div>
|
||||
<div class="stat-panel"><h1 class="fw-bold mb-0" id="kcal">0</h1><p class="text-uppercase fw-bold m-0 opacity-75 small">Target Calories</p></div>
|
||||
<div class="stat-panel"><h1 class="fw-bold mb-0" id="kcal">2166</h1><p class="text-uppercase fw-bold m-0 opacity-75 small">Target Calories</p></div>
|
||||
<div class="water-hub">
|
||||
<h2 class="fw-bold text-info mb-0" id="h2o">0.0L</h2>
|
||||
<h2 class="fw-bold text-info mb-0" id="h2o">3.9L</h2>
|
||||
<span class="label-pro" id="txtH2O"><i class="fas fa-droplet me-1"></i> Daily Hydration</span>
|
||||
</div>
|
||||
<div class="macro-hub">
|
||||
<canvas id="mChart" style="max-height: 120px;"></canvas>
|
||||
<div class="row mt-2 text-center fw-bold small">
|
||||
<div class="col-4 text-info">P: <span id="pG">0g</span></div>
|
||||
<div class="col-4 text-danger">C: <span id="cG">0g</span></div>
|
||||
<div class="col-4 text-warning">F: <span id="fG">0g</span></div>
|
||||
<div class="col-4 text-info">P: <span id="pG">162g</span></div>
|
||||
<div class="col-4 text-danger">C: <span id="cG">217g</span></div>
|
||||
<div class="col-4 text-warning">F: <span id="fG">72g</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn-reset" onclick="resetAll()"><i class="fas fa-sync me-2"></i> RESET SYSTEM</button>
|
||||
@@ -101,8 +100,8 @@
|
||||
</div>
|
||||
<div id="chat" class="chat-container">
|
||||
<div class="msg ai shadow">
|
||||
<h5 class="fw-bold text-primary">Precision Audit Active.</h5>
|
||||
Calorie hallucination protection is engaged. Using strict USDA-aligned reference values.
|
||||
<h5 class="fw-bold text-primary">Biometric Audit Engaged.</h5>
|
||||
I have corrected the nutritional database. Hallucinations regarding rice and oat density have been restricted.
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-area">
|
||||
@@ -157,13 +156,10 @@
|
||||
}
|
||||
|
||||
function resetAll() {
|
||||
['w','t','h','age','agg'].forEach(id => document.getElementById(id).value = id === 'agg' ? 0 : "");
|
||||
['w','t','h','age','agg'].forEach(id => document.getElementById(id).value = "");
|
||||
document.getElementById('agg').value = 0;
|
||||
document.getElementById('act').selectedIndex = 0;
|
||||
document.getElementById('kcal').innerText = "0";
|
||||
document.getElementById('h2o').innerText = isMetric ? "0.0L" : "0oz";
|
||||
document.getElementById('chat').innerHTML = `<div class="msg ai shadow">System reset. Ready for input.</div>`;
|
||||
conversationHistory = [];
|
||||
if(mChart) { mChart.data.datasets[0].data = [1,1,1]; mChart.update(); }
|
||||
update();
|
||||
}
|
||||
|
||||
async function talk(custom) {
|
||||
@@ -172,20 +168,28 @@
|
||||
const text = custom === 'GENERATE_SHOPPING_LIST' ? "GENERATE_SHOPPING_LIST" : (custom || input.value);
|
||||
if(!text) return;
|
||||
if(!custom) { box.innerHTML += `<div class="msg user shadow-sm">${text}</div>`; input.value=""; }
|
||||
const id = 'ai-'+Date.now(); box.innerHTML += `<div id="${id}" class="msg ai shadow">Auditing ingredient density...</div>`;
|
||||
const id = 'ai-'+Date.now(); box.innerHTML += `<div id="${id}" class="msg ai shadow">Applying physical laws to calories...</div>`;
|
||||
box.scrollTop = box.scrollHeight;
|
||||
|
||||
const sysPrompt = {role:"system", content: `Expert Dietitian. TARGET: ${targetKcal} kcal.
|
||||
|
||||
CRITICAL MATH RULES:
|
||||
1. NO HALLUCINATION: You are forbidden from claiming (450g Oats = 600kcal).
|
||||
2. USDA LOOKUP: You must use real values (e.g., Raw Oats ~380kcal/100g, Chicken Breast ~165kcal/100g).
|
||||
3. REAL WEIGHTS: If the user needs ${targetKcal} kcal, adjust the GRAMS to match reality. Do not adjust the CALORIES to match a fake gram weight.
|
||||
4. ABSOLUTE TOTALS: Sum every row. If Daily Total != ${targetKcal}, you must re-calculate portions before answering.
|
||||
REFERENCE TRUTH TABLE (FORBIDDEN TO IGNORE):
|
||||
- Raw Brown Rice: 360-370 kcal per 100g.
|
||||
- Raw Oats: 380-390 kcal per 100g.
|
||||
- Raw Chicken Breast: 165 kcal per 100g.
|
||||
- Whole Wheat Bread: 250 kcal per 100g (~70-90 per slice).
|
||||
|
||||
STRICT RULES:
|
||||
1. NO "FAKING": If you need to hit ${targetKcal}, you must lower the WEIGHT (grams) if the calories are too high. Do NOT lie about the calories per gram.
|
||||
2. NO ADD-ONS: No "add a snack later" notes. Incorporate all calories into the main tables.
|
||||
3. TOTAL LOCK: (Meal 1 + Meal 2 + Meal 3 + Snack) MUST EQUAL EXACTLY ${targetKcal}.
|
||||
|
||||
FORMAT:
|
||||
#### [Meal Name]
|
||||
| Ingredient | Weight (RAW) | Calories | P | C | F |
|
||||
Daily Total: [Exact Sum] kcal (Must equal ${targetKcal})`};
|
||||
Meal Total: [Sum] kcal
|
||||
|
||||
**Daily Total: ${targetKcal} kcal**`};
|
||||
|
||||
conversationHistory.push({role: "user", content: text});
|
||||
try {
|
||||
@@ -194,7 +198,7 @@
|
||||
body: JSON.stringify({
|
||||
model:"llama-3.3-70b-versatile",
|
||||
messages:[sysPrompt, ...conversationHistory],
|
||||
temperature: 0.0
|
||||
temperature: 0.0 // Zero creativity, maximum precision.
|
||||
})
|
||||
});
|
||||
const d = await res.json();
|
||||
@@ -207,10 +211,10 @@
|
||||
|
||||
window.onload = () => {
|
||||
mChart = new Chart(document.getElementById('mChart').getContext('2d'), {
|
||||
type: 'doughnut', data: { datasets: [{ data: [1,1,1], backgroundColor: ['#0dcaf0','#dc3545','#ffc107'], borderWeight:0 }] },
|
||||
type: 'doughnut', data: { datasets: [{ data: [162*4, 217*4, 72*9], backgroundColor: ['#0dcaf0','#dc3545','#ffc107'], borderWeight:0 }] },
|
||||
options: { plugins: { legend: { display: false } }, cutout: '75%' }
|
||||
});
|
||||
resetAll();
|
||||
update();
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user