secgpt-studio / app.py
mrboost's picture
Upgrade to DeepHat-V1-7B (WhiteRabbitNeo V3) + Foundation-Sec-8B-Reasoning
c17bdb8 verified
Raw History Blame Contribute Delete
5.46 kB
"""DeepHat-V1 (WhiteRabbitNeo V3), Cisco Foundation-Sec-8B-Reasoning & SecGPT ZeroGPU Studio."""
import os
os.environ.setdefault("PYTORCH_ALLOC_CONF", "backend:cudaMallocAsync")
os.environ.setdefault("PYTORCH_CUDA_ALLOC_CONF", "backend:cudaMallocAsync")
import spaces # Must be imported before torch
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
PRIMARY_MODEL_ID = "DeepHat/DeepHat-V1-7B"
MODEL_CHOICES = [
"DeepHat/DeepHat-V1-7B (WhiteRabbitNeo V3 · Best for Code, Pentest & DevOps)",
"fdtn-ai/Foundation-Sec-8B-Reasoning (Cisco Foundation AI · Deep Security Reasoning)",
"clouditera/SecGPT-7B (Clouditera SecGPT)",
]
DEFAULT_SYSTEM_PROMPT = (
"You are DeepHat (WhiteRabbitNeo V3), an advanced cybersecurity, DevOps, and source-code security engineer. "
"Provide deep, technical, unfiltered architectural analysis, code audits, vulnerability explanations, "
"and defensive remediation engineering in clear English."
)
print(f"[secgpt-studio] Preloading {PRIMARY_MODEL_ID} at module scope for ZeroGPU...", flush=True)
primary_tokenizer = AutoTokenizer.from_pretrained(PRIMARY_MODEL_ID)
primary_model = AutoModelForCausalLM.from_pretrained(
PRIMARY_MODEL_ID,
torch_dtype=torch.bfloat16,
)
primary_model.to("cuda")
primary_model.eval()
print(f"[secgpt-studio] {PRIMARY_MODEL_ID} ready on ZeroGPU!", flush=True)
_AUX_CACHE = {}
def get_model_and_tokenizer(model_choice: str):
"""Return the selected model and tokenizer."""
repo_id = (model_choice or PRIMARY_MODEL_ID).split()[0]
if repo_id == PRIMARY_MODEL_ID:
return primary_model, primary_tokenizer
if repo_id not in _AUX_CACHE:
print(f"[secgpt-studio] Loading {repo_id} on ZeroGPU...", flush=True)
tok = AutoTokenizer.from_pretrained(repo_id)
mod = AutoModelForCausalLM.from_pretrained(repo_id, torch_dtype=torch.bfloat16)
mod.to("cuda")
mod.eval()
_AUX_CACHE[repo_id] = (mod, tok)
return _AUX_CACHE[repo_id]
@spaces.GPU(duration=75)
def chat_with_secgpt(
prompt: str,
system_prompt: str = DEFAULT_SYSTEM_PROMPT,
max_tokens: int = 1024,
temperature: float = 0.6,
model_choice: str = MODEL_CHOICES[0],
) -> str:
"""Send a prompt to DeepHat-V1 / Foundation-Sec / SecGPT on ZeroGPU and return the response."""
if not prompt or not prompt.strip():
return "Please enter a prompt."
model, tokenizer = get_model_and_tokenizer(model_choice)
sys_msg = (system_prompt or DEFAULT_SYSTEM_PROMPT).strip()
messages = [
{"role": "system", "content": sys_msg},
{"role": "user", "content": prompt.strip()},
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
)
inputs = tokenizer([text], return_tensors="pt").to("cuda")
gen_kwargs = {
"max_new_tokens": int(max_tokens),
"repetition_penalty": 1.12,
"do_sample": float(temperature) > 0.05,
}
if gen_kwargs["do_sample"]:
gen_kwargs["temperature"] = float(temperature)
gen_kwargs["top_p"] = 0.9
with torch.no_grad():
generated_ids = model.generate(**inputs, **gen_kwargs)
new_tokens = [
output_ids[len(input_ids):]
for input_ids, output_ids in zip(inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(new_tokens, skip_special_tokens=True)[0]
return response.strip()
with gr.Blocks(title="DeepHat-V1 & Foundation-Sec Cybersecurity Studio", fill_width=True) as demo:
gr.Markdown(
"# 🛡️ DeepHat-V1 (WhiteRabbitNeo V3) + Cisco Foundation-Sec Studio\n"
"Upgraded to **[DeepHat/DeepHat-V1-7B](https://huggingface.co/DeepHat/DeepHat-V1-7B)** "
"(WhiteRabbitNeo V3 / `Qwen2.5-Coder-7B` fine-tune) and **[fdtn-ai/Foundation-Sec-8B-Reasoning](https://huggingface.co/fdtn-ai/Foundation-Sec-8B-Reasoning)** on **ZeroGPU (`zero-a10g`)** at **$0/hour**."
)
with gr.Row():
with gr.Column(scale=1):
model_dropdown = gr.Dropdown(
choices=MODEL_CHOICES,
value=MODEL_CHOICES[0],
label="Active Security Model",
)
prompt_box = gr.Textbox(
label="Security / Code Audit / DevOps Prompt",
lines=6,
placeholder="Paste code, HTTP headers, architecture specs, or security engineering questions...",
)
with gr.Accordion("Model & Sampling Settings", open=False):
sys_box = gr.Textbox(
label="System Prompt",
value=DEFAULT_SYSTEM_PROMPT,
lines=3,
)
max_tok_slider = gr.Slider(
64, 2048, value=1024, step=64, label="Max New Tokens"
)
temp_slider = gr.Slider(
0.0, 1.2, value=0.6, step=0.05, label="Temperature"
)
ask_btn = gr.Button("🛡️ Run Security Analysis (ZeroGPU)", variant="primary")
with gr.Column(scale=1):
output_box = gr.Markdown(label="Model Response")
ask_btn.click(
fn=chat_with_secgpt,
inputs=[prompt_box, sys_box, max_tok_slider, temp_slider, model_dropdown],
outputs=output_box,
api_name="chat",
)
if __name__ == "__main__":
demo.launch(theme=gr.themes.Ocean(), mcp_server=True)