Spaces:
Build error
Build error
Upload folder using huggingface_hub
Browse files- .gitattributes +35 -35
- .gitignore +1 -0
- README.md +14 -14
- app.py +128 -0
- requirements.txt +3 -0
.gitattributes
CHANGED
|
@@ -1,35 +1,35 @@
|
|
| 1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
gemma-2-2b-it.q3_k_m.gguf
|
README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
| 1 |
-
---
|
| 2 |
-
title: CooLLaMA
|
| 3 |
-
emoji: 🏢
|
| 4 |
-
colorFrom: green
|
| 5 |
-
colorTo: blue
|
| 6 |
-
sdk: gradio
|
| 7 |
-
sdk_version: 6.5.1
|
| 8 |
-
app_file: app.py
|
| 9 |
-
pinned: false
|
| 10 |
-
license: mit
|
| 11 |
-
short_description: Best AI
|
| 12 |
-
---
|
| 13 |
-
|
| 14 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: CooLLaMA
|
| 3 |
+
emoji: 🏢
|
| 4 |
+
colorFrom: green
|
| 5 |
+
colorTo: blue
|
| 6 |
+
sdk: gradio
|
| 7 |
+
sdk_version: 6.5.1
|
| 8 |
+
app_file: app.py
|
| 9 |
+
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
+
short_description: Best AI
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import uuid
|
| 3 |
+
from flask import Flask, request, jsonify, render_template_string, send_from_directory
|
| 4 |
+
import ollama
|
| 5 |
+
import requests
|
| 6 |
+
|
| 7 |
+
app = Flask(__name__)
|
| 8 |
+
|
| 9 |
+
# === GGUF MODEL DOWNLOAD ===
|
| 10 |
+
MODEL_URL = "https://huggingface.co/CooLLaMACEO/CooLLaMA-Gemma2/resolve/main/gemma-2-2b-it.q3_k_m.gguf"
|
| 11 |
+
MODEL_DIR = "models"
|
| 12 |
+
MODEL_PATH = os.path.join(MODEL_DIR, "gemma-2-2b-it.q3_k_m.gguf")
|
| 13 |
+
|
| 14 |
+
os.makedirs(MODEL_DIR, exist_ok=True)
|
| 15 |
+
|
| 16 |
+
if not os.path.exists(MODEL_PATH):
|
| 17 |
+
print("Downloading GGUF model...")
|
| 18 |
+
with requests.get(MODEL_URL, stream=True) as r:
|
| 19 |
+
r.raise_for_status()
|
| 20 |
+
with open(MODEL_PATH, "wb") as f:
|
| 21 |
+
for chunk in r.iter_content(chunk_size=1024*1024):
|
| 22 |
+
if chunk:
|
| 23 |
+
f.write(chunk)
|
| 24 |
+
print("Download complete!")
|
| 25 |
+
|
| 26 |
+
# === HTML TEMPLATE ===
|
| 27 |
+
HTML_TEMPLATE = """
|
| 28 |
+
<!DOCTYPE html>
|
| 29 |
+
<html lang="en">
|
| 30 |
+
<head>
|
| 31 |
+
<meta charset="UTF-8">
|
| 32 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 33 |
+
<title>CooLLaMA AI</title>
|
| 34 |
+
<link rel="icon" type="image/x-icon" href="/favicon.ico">
|
| 35 |
+
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;800&display=swap" rel="stylesheet">
|
| 36 |
+
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
| 37 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet" />
|
| 38 |
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
|
| 39 |
+
<style>
|
| 40 |
+
:root { --bg:#0b0f1a; --card:#161b2c; --user-blue:#2563eb; --ai-bubble:#1e293b; --accent:#8b5cf6; --text-light:#f1f5f9; --text-dim:#64748b; }
|
| 41 |
+
body { font-family:'Plus Jakarta Sans',sans-serif; background:var(--bg); color:var(--text-light); display:flex; height:100vh; margin:0; overflow:hidden; }
|
| 42 |
+
#sidebar { width:260px; background:#090c14; display:flex; flex-direction:column; border-right:1px solid #2d3748; padding:20px; }
|
| 43 |
+
.new-chat-btn { background:linear-gradient(135deg,#2563eb,#7c3aed); border:none; color:white; padding:14px; border-radius:12px; cursor:pointer; font-weight:800; margin-bottom:25px; transition:all 0.2s ease; }
|
| 44 |
+
.new-chat-btn:hover { transform:translateY(-2px); box-shadow:0 5px 15px rgba(37,99,235,0.4); }
|
| 45 |
+
#chat-list { flex:1; overflow-y:auto; display:flex; flex-direction:column; gap:8px; }
|
| 46 |
+
.chat-item { padding:12px; border-radius:10px; cursor:pointer; font-size:13px; color:var(--text-dim); transition:0.3s; border:1px solid transparent; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
| 47 |
+
.chat-item:hover { background:#1e293b; color:white; border-color:#334155; box-shadow:0 0 10px rgba(139,92,246,0.1); }
|
| 48 |
+
.chat-item.active { background:#1e293b; color:white; border-color:#2563eb; }
|
| 49 |
+
#main-container { flex:1; display:flex; flex-direction:column; }
|
| 50 |
+
header { padding:20px 30px; border-bottom:1px solid #2d3748; display:flex; justify-content:space-between; align-items:center; }
|
| 51 |
+
header h1 { font-size:1.5rem; margin:0; font-weight:800; background:linear-gradient(90deg,#60a5fa,#a78bfa); -webkit-background-clip:text; -webkit-text-fill-color:transparent; }
|
| 52 |
+
#chat { flex:1; padding:25px; overflow-y:auto; display:flex; flex-direction:column; gap:20px; scroll-behavior:smooth; }
|
| 53 |
+
.message-row { display:flex; flex-direction:column; width:100%; animation:slideUp 0.3s ease-out forwards; }
|
| 54 |
+
@keyframes slideUp { from { opacity:0; transform:translateY(10px); } to { opacity:1; transform:translateY(0); } }
|
| 55 |
+
.message { max-width:85%; padding:14px 20px; border-radius:18px; font-size:15px; line-height:1.6; }
|
| 56 |
+
.user-row { align-items:flex-end; }
|
| 57 |
+
.user { background:var(--user-blue); color:white; border-bottom-right-radius:2px; }
|
| 58 |
+
.ai-row { align-items:flex-start; }
|
| 59 |
+
.ai { background:var(--ai-bubble); color:var(--text-light); border:1px solid #334155; border-bottom-left-radius:2px; }
|
| 60 |
+
.ai-cursor { color:var(--accent); font-weight:bold; margin-right:8px; animation:blink 1s infinite; }
|
| 61 |
+
@keyframes blink { 0%,100% {opacity:1;} 50% {opacity:0.3;} }
|
| 62 |
+
.label { font-size:10px; font-weight:700; margin-bottom:6px; color:var(--text-dim); text-transform:uppercase; letter-spacing:0.8px; }
|
| 63 |
+
#input-container { padding:25px; background:var(--card); border-top:1px solid #2d3748; }
|
| 64 |
+
.input-box { max-width:850px; margin:0 auto; display:flex; background:#0b0f1a; border:1px solid #334155; border-radius:15px; padding:10px; align-items:flex-end; }
|
| 65 |
+
textarea { flex:1; border:none; background:transparent; padding:10px; font-size:16px; outline:none; color:white; resize:none; font-family:inherit; }
|
| 66 |
+
button#send-btn { background:var(--user-blue); border:none; color:white; padding:0 25px; border-radius:10px; cursor:pointer; font-weight:800; height:45px; }
|
| 67 |
+
.typing-container { display:flex; align-items:flex-start; gap:10px; margin-top:5px; }
|
| 68 |
+
.dot { width:6px; height:6px; background:var(--accent); border-radius:50%; animation:bounce 1.4s infinite ease-in-out both; }
|
| 69 |
+
.dot:nth-child(1){animation-delay:-0.32s;} .dot:nth-child(2){animation-delay:-0.16s;}
|
| 70 |
+
@keyframes bounce {0%,80%,100%{transform:scale(0);}40%{transform:scale(1.0);}}
|
| 71 |
+
</style>
|
| 72 |
+
</head>
|
| 73 |
+
<body>
|
| 74 |
+
<div id="sidebar">
|
| 75 |
+
<button class="new-chat-btn" onclick="startNewChat()">+ New Chat</button>
|
| 76 |
+
<div id="chat-list"></div>
|
| 77 |
+
<button onclick="clearAllCache()" style="background:transparent; border:none; color:#334155; font-size:10px; cursor:pointer; margin-top:20px; font-weight:700;">RESET CACHE</button>
|
| 78 |
+
</div>
|
| 79 |
+
<div id="main-container">
|
| 80 |
+
<header><h1>🦙 CooLLaMA</h1><div style="font-size:10px; color:#64748b; font-weight:700;">v3.5 ANIMATED</div></header>
|
| 81 |
+
<div id="chat"></div>
|
| 82 |
+
<div id="input-container">
|
| 83 |
+
<div class="input-box">
|
| 84 |
+
<textarea id="message" placeholder="Send a message..." rows="1" oninput="this.style.height='';this.style.height=this.scrollHeight+'px'"></textarea>
|
| 85 |
+
<button id="send-btn" onclick="sendMessage()">Send</button>
|
| 86 |
+
</div>
|
| 87 |
+
</div>
|
| 88 |
+
</div>
|
| 89 |
+
<script>
|
| 90 |
+
let currentChatId = null;
|
| 91 |
+
let localData = JSON.parse(localStorage.getItem('coolllama_v4_chats')) || {};
|
| 92 |
+
marked.setOptions({ breaks:true, highlight:(code,lang)=>Prism.languages[lang]?Prism.highlight(code,Prism.languages[lang],lang):code });
|
| 93 |
+
function loadSidebar(){const list=document.getElementById("chat-list");list.innerHTML="";Object.keys(localData).reverse().forEach(id=>{const item=document.createElement("div");item.className="chat-item"+(id===currentChatId?" active":"");item.id="item-"+id;item.innerHTML=`💬 Session ${id}`;item.onclick=()=>selectChat(id);list.appendChild(item);});}
|
| 94 |
+
async function startNewChat(){const res=await fetch("/new_chat",{method:"POST"});const data=await res.json();currentChatId=data.chat_id;localData[currentChatId]=[];saveToCache();loadSidebar();selectChat(currentChatId);}
|
| 95 |
+
function selectChat(id){currentChatId=id;document.querySelectorAll('.chat-item').forEach(el=>el.classList.remove('active'));if(document.getElementById("item-"+id))document.getElementById("item-"+id).classList.add("active");document.getElementById("chat").innerHTML="";if(localData[id])localData[id].forEach(msg=>appendMessage(msg.role,msg.content,false));}
|
| 96 |
+
function appendMessage(role,text,isNew=true){const chatDiv=document.getElementById("chat");const row=document.createElement("div");row.className=`message-row ${role==='user'?'user-row':'ai-row'}`;if(!isNew)row.style.animation='none';const prefix=(role!=='user')?'<span class="ai-cursor">■</span>':'';const content=role==='user'?document.createTextNode(text).textContent:marked.parse(text);row.innerHTML=`<span class="label">${role==='user'?'You':'CooLLaMA'}</span><div class="message ${role==='user'?'user':'ai'}">${prefix}${content}</div>`;chatDiv.appendChild(row);chatDiv.scrollTop=chatDiv.scrollHeight;Prism.highlightAll();}
|
| 97 |
+
async function sendMessage(){const input=document.getElementById("message");const text=input.value.trim();if(!text||!currentChatId)return;appendMessage('user',text);localData[currentChatId].push({role:'user',content:text});saveToCache();input.value="";input.style.height='auto';const chatDiv=document.getElementById("chat");const thinkRow=document.createElement("div");thinkRow.id="thinking-indicator";thinkRow.className="message-row ai-row";thinkRow.innerHTML=`<span class="label">CooLLaMA</span><div class="typing-container"><div class="dot"></div><div class="dot"></div><div class="dot"></div></div>`;chatDiv.appendChild(thinkRow);chatDiv.scrollTop=chatDiv.scrollHeight;try{const res=await fetch("/chat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({history:localData[currentChatId]})});const data=await res.json();document.getElementById("thinking-indicator").remove();appendMessage('assistant',data.response);localData[currentChatId].push({role:'assistant',content:data.response});saveToCache();}catch(e){document.getElementById("thinking-indicator").innerText="Error."}}
|
| 98 |
+
function saveToCache(){localStorage.setItem('coolllama_v4_chats',JSON.stringify(localData));}
|
| 99 |
+
function clearAllCache(){if(confirm("Reset all?")){localStorage.clear();location.reload();}}
|
| 100 |
+
document.getElementById("message").addEventListener("keydown",e=>{if(e.key==="Enter"&&!e.shiftKey){e.preventDefault();sendMessage();}});
|
| 101 |
+
loadSidebar();if(Object.keys(localData).length>0)selectChat(Object.keys(localData).sort().reverse()[0]);else startNewChat();
|
| 102 |
+
</script>
|
| 103 |
+
</body>
|
| 104 |
+
</html>
|
| 105 |
+
"""
|
| 106 |
+
|
| 107 |
+
@app.route("/")
|
| 108 |
+
def index():
|
| 109 |
+
return render_template_string(HTML_TEMPLATE)
|
| 110 |
+
|
| 111 |
+
@app.route('/favicon.ico')
|
| 112 |
+
def favicon():
|
| 113 |
+
return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico', mimetype='image/vnd.microsoft.icon')
|
| 114 |
+
|
| 115 |
+
@app.route("/new_chat", methods=["POST"])
|
| 116 |
+
def new_chat():
|
| 117 |
+
return jsonify({"chat_id": str(uuid.uuid4())[:8].upper()})
|
| 118 |
+
|
| 119 |
+
@app.route("/chat", methods=["POST"])
|
| 120 |
+
def chat():
|
| 121 |
+
data = request.json
|
| 122 |
+
history = data.get("history", [])
|
| 123 |
+
messages = [{"role": "system", "content": "You are CooLLaMA, an AI by the CooLLaMA Team."}] + history[-10:]
|
| 124 |
+
result = ollama.chat(model=MODEL_PATH, messages=messages, options={"temperature":0.4})
|
| 125 |
+
return jsonify({"response": result["message"]["content"]})
|
| 126 |
+
|
| 127 |
+
if __name__ == "__main__":
|
| 128 |
+
app.run(host="0.0.0.0", port=5000)
|
requirements.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Flask==2.3.3
|
| 2 |
+
requests==2.31.0
|
| 3 |
+
ollama
|