File size: 3,723 Bytes
548ac73
5da2830
34b86b6
548ac73
2f55627
 
 
34b86b6
548ac73
2f55627
548ac73
8361a08
34b86b6
 
548ac73
8bc3eea
34b86b6
 
 
2f55627
34b86b6
8361a08
8bc3eea
 
 
 
 
 
 
 
 
 
34b86b6
2f55627
8bc3eea
 
 
 
5da2830
 
2f55627
 
 
34b86b6
5da2830
 
 
 
2f55627
8bc3eea
 
 
2f55627
 
 
5da2830
c1a6fab
8bc3eea
 
 
 
 
 
 
 
 
 
 
5da2830
8bc3eea
2f55627
 
8bc3eea
 
2f55627
8bc3eea
 
2f55627
8bc3eea
2f55627
 
 
8bc3eea
2f55627
8bc3eea
 
34b86b6
8bc3eea
2f55627
 
 
 
 
 
 
 
8bc3eea
2f55627
 
 
 
 
 
 
 
 
8bc3eea
2f55627
8bc3eea
 
2f55627
 
 
8bc3eea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import os
import gradio as gr
import spaces
import zipfile
import json
import re
import uuid
from huggingface_hub import hf_hub_download
from llama_cpp import Llama
from llama_cpp_agent import LlamaCppAgent, MessagesFormatterType
from llama_cpp_agent.providers import LlamaCppPythonProvider

MODEL_NAME = "neuraldaredevil-8b-abliterated-q4_k_m-imat.gguf"
MODEL_PATH = f"models/{MODEL_NAME}"

# Pre-download model
hf_hub_download(
    repo_id="tHottie/NeuralDaredevil-8B-abliterated-Q4_K_M-GGUF",
    filename=MODEL_NAME,
    local_dir="./models",
)

LOG_FILE = "/tmp/agent_code_packager.log"

def log(msg: str):
    try:
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(msg + "\n")
    except Exception:
        pass
    print(msg)

@spaces.GPU(duration=120)
def process_and_package(ai_response: str):
    log("=== Starting process_and_package ===")
    log(f"AI response input: {ai_response[:200]}...")

    # Initialize model & agent
    llm = Llama(
        model_path=MODEL_PATH,
        n_gpu_layers=0,
        n_batch=512,
        n_ctx=4096,
        verbose=False
    )
    provider = LlamaCppPythonProvider(llm)
    agent = LlamaCppAgent(
        provider,
        system_prompt=(
            "You are a code parsing assistant. The user will paste AI output referencing multiple code files. "
            "Return a JSON object mapping each filename to its full source code text. "
            "Do not return anything else."
        ),
        predefined_messages_formatter_type=MessagesFormatterType.GEMMA_2,
        debug_output=True
    )

    # Call the agent
    # Use get_chat_response (not run)
    try:
        settings = provider.get_provider_default_settings()
        response = agent.get_chat_response(ai_response, llm_sampling_settings=settings)
    except Exception as e:
        log(f"Error in get_chat_response: {e}")
        response = ""  # fallback to empty

    log("Agent response:")
    log(response[:1000] if len(response) > 1000 else response)

    # Parse output from agent
    file_map = {}
    try:
        file_map = json.loads(response)
        log("Parsed JSON file map keys: " + ", ".join(file_map.keys()))
    except Exception as e:
        log(f"JSON parse failed: {e}")
        # fallback regex
        pattern = r"Filename:\s*(?P<fname>[\w\.\-/]+)\s*```(?:[a-zA-Z0-9]*\n)?(?P<code>[\s\S]*?)```"
        for m in re.finditer(pattern, response, re.DOTALL):
            fname = m.group("fname").strip()
            code = m.group("code").rstrip()
            file_map[fname] = code
        log("After regex fallback, keys: " + ", ".join(file_map.keys()))
        if not file_map:
            file_map["output.txt"] = response
            log("Fallback to single file: output.txt")

    # Write files & zip
    temp_dir = f"/tmp/codeproj_{uuid.uuid4().hex}"
    os.makedirs(temp_dir, exist_ok=True)

    for fname, code in file_map.items():
        dest = os.path.join(temp_dir, fname)
        os.makedirs(os.path.dirname(dest), exist_ok=True)
        with open(dest, "w", encoding="utf-8") as f:
            f.write(code)
        log(f"Wrote file: {dest}")

    zip_name = f"code_bundle_{uuid.uuid4().hex}.zip"
    zip_path = os.path.join("/tmp", zip_name)
    with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
        for root, _, files in os.walk(temp_dir):
            for fn in files:
                fullp = os.path.join(root, fn)
                rel = os.path.relpath(fullp, temp_dir)
                zf.write(fullp, arcname=rel)
                log(f"Added to zip: {rel}")

    log(f"Zip created: {zip_path}")
    log("=== Finished process_and_package ===\n")
    return zip_path

with gr.Blocks() as demo:
    gr.Markdown("### Paste