CodeZipper / app.py
MegaTronX's picture
Update app.py
122833b verified
import os
import re
import json
import tempfile
import zipfile
import gradio as gr
import spaces
from huggingface_hub import hf_hub_download
# ---- LLM: llama.cpp via llama_cpp_agent ----
from llama_cpp import Llama
from llama_cpp_agent import LlamaCppAgent, MessagesFormatterType
from llama_cpp_agent.providers import LlamaCppPythonProvider
# ----------------------
# Model configuration
# ----------------------
DEFAULT_REPO_ID = "tHottie/NeuralDaredevil-8B-abliterated-Q4_K_M-GGUF"
DEFAULT_FILENAME = "neuraldaredevil-8b-abliterated-q4_k_m-imat.gguf"
MODELS_DIR = "models"
os.makedirs(MODELS_DIR, exist_ok=True)
def ensure_model(repo_id: str, filename: str) -> str:
local_path = os.path.join(MODELS_DIR, filename)
if not os.path.exists(local_path):
hf_hub_download(repo_id=repo_id, filename=filename, local_dir=MODELS_DIR)
return local_path
# GPU context ensures model loads only when a GPU session is active
@spaces.GPU(duration=120)
def package_with_llm(ai_text, repo_id, filename, temperature, top_p, top_k, repeat_penalty, max_tokens, force_heuristic):
model_path = ensure_model(repo_id, filename)
llm = Llama(
model_path=model_path,
n_ctx=8192,
n_gpu_layers=81,
n_batch=1024,
flash_attn=True,
)
provider = LlamaCppPythonProvider(llm)
agent = LlamaCppAgent(
provider,
system_prompt=(
"You are an expert code-packager and software project compiler. "
"Given an AI-generated project description containing code blocks and hints "
"about filenames or structure, extract each file with its most likely filename "
"and exact code content. Return ONLY a strict JSON array named manifest, "
"where each element is an object with keys 'filename' and 'content'. "
"Do not add commentary outside JSON. "
"Ensure filenames include directories if implied (e.g., 'src/main.py'). "
"Preserve code exactly as provided inside code fences."
),
predefined_messages_formatter_type=MessagesFormatterType.GEMMA_2,
debug_output=False
)
prompt = f"""
Read the following AI project description and return ONLY JSON.
Output schema (strict):
[{{"filename": "server.js", "content": "// code..."}}]
AI project description:
{ai_text}
"""
settings = provider.get_provider_default_settings()
settings.temperature = float(temperature)
settings.top_p = float(top_p)
settings.top_k = int(top_k)
settings.repeat_penalty = float(repeat_penalty)
settings.max_tokens = int(max_tokens)
settings.stream = False
out = agent.get_chat_response(prompt, llm_sampling_settings=settings, print_output=False)
# Parse JSON output robustly
try:
start, end = out.find('['), out.rfind(']')
if start != -1 and end > start:
manifest = json.loads(out[start:end+1])
else:
raise ValueError("No JSON found")
except Exception:
manifest = [{"filename": "project.txt", "content": out}]
# Heuristic fallback if model fails
if force_heuristic or (len(manifest) == 1 and manifest[0]["filename"] == "project.txt"):
manifest = naive_regex_merge(ai_text)
return create_zip_from_manifest(manifest)
def naive_regex_merge(text):
blocks = []
code_pattern = re.compile(r"```([a-zA-Z0-9]*)\n(.*?)```", re.DOTALL)
lines = text.splitlines()
candidates = []
for line in lines:
m = re.search(r"([A-Za-z0-9_\-./]+?\.[A-Za-z0-9]+)", line)
if m:
candidates.append(m.group(1))
for idx, m in enumerate(code_pattern.finditer(text)):
lang = m.group(1) or "txt"
code = m.group(2)
filename = candidates[idx] if idx < len(candidates) else f"file_{idx+1}.{lang}"
blocks.append({"filename": filename, "content": code})
return blocks
def create_zip_from_manifest(manifest):
temp_dir = tempfile.mkdtemp()
zip_path = os.path.join(temp_dir, "project.zip")
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as z:
for item in manifest:
fname = item.get("filename", "project.txt").lstrip("/")
content = item.get("content", "")
fpath = os.path.join(temp_dir, fname)
os.makedirs(os.path.dirname(fpath), exist_ok=True)
with open(fpath, "w", encoding="utf-8") as f:
f.write(content)
z.write(fpath, arcname=fname)
return zip_path
# --------------------------
# Gradio Interface
# --------------------------
with gr.Blocks(title="AI Project Packager (GGUF, ZeroGPU)") as demo:
gr.Markdown("# AI Project Packager (GGUF, ZeroGPU)")
gr.Markdown("Uses ephemeral GPU power to infer filenames & package AI-generated code projects.")
with gr.Row():
ai_text = gr.Textbox(lines=24, label="Paste AI response here")
with gr.Accordion("LLM Settings", open=False):
repo_id = gr.Textbox(value=DEFAULT_REPO_ID, label="Model repo_id")
filename = gr.Textbox(value=DEFAULT_FILENAME, label="Model filename (*.gguf)")
with gr.Row():
temperature = gr.Slider(0.0, 2.0, value=0.2, step=0.05, label="Temperature")
top_p = gr.Slider(0.1, 1.0, value=0.9, step=0.05, label="Top-p")
top_k = gr.Slider(0, 100, value=40, step=1, label="Top-k")
with gr.Row():
repeat_penalty = gr.Slider(0.8, 2.0, value=1.1, step=0.05, label="Repeat penalty")
max_tokens = gr.Slider(256, 4096, value=2048, step=32, label="Max tokens")
force_heuristic = gr.Checkbox(value=False, label="Force heuristic filename/code merge if JSON parse fails")
out_zip = gr.File(label="Download packaged ZIP")
run_btn = gr.Button("Package Project", variant="primary")
run_btn.click(
fn=package_with_llm,
inputs=[ai_text, repo_id, filename, temperature, top_p, top_k, repeat_penalty, max_tokens, force_heuristic],
outputs=[out_zip]
)
if __name__ == "__main__":
demo.launch()