File size: 4,715 Bytes
25bf9bb
 
973db88
25bf9bb
 
 
 
 
 
 
 
 
 
 
 
3380f8e
25bf9bb
973db88
25bf9bb
 
 
 
 
3380f8e
ca40114
25bf9bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3380f8e
25bf9bb
 
 
3380f8e
065cfda
25bf9bb
 
 
 
 
 
 
 
 
 
065cfda
25bf9bb
 
 
 
973db88
 
065cfda
25bf9bb
 
 
 
 
 
973db88
25bf9bb
 
 
065cfda
25bf9bb
 
 
 
 
 
 
 
 
3380f8e
25bf9bb
 
 
 
 
 
 
3380f8e
065cfda
25bf9bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
116
117
118
/* static/index.js  — AnyCoder AI front‑end */

const MODELS = [
  { name: "Qwen/Qwen3‑32B",            id: "Qwen/Qwen3-32B" },
  { name: "Moonshot Kimi‑K2",         id: "moonshotai/Kimi-K2-Instruct", provider: "groq" },
  { name: "DeepSeek V3",              id: "deepseek-ai/DeepSeek-V3-0324" },
  { name: "DeepSeek R1",              id: "deepseek-ai/DeepSeek-R1-0528" },
  { name: "ERNIE‑4.5‑VL",            id: "baidu/ERNIE-4.5-VL-424B-A47B-Base-PT" },
  { name: "MiniMax M1",               id: "MiniMaxAI/MiniMax-M1-80k" },
  { name: "Qwen3‑235B‑A22B",          id: "Qwen/Qwen3-235B-A22B" },
  { name: "SmolLM3‑3B",               id: "HuggingFaceTB/SmolLM3-3B" },
  { name: "GLM‑4.1V‑9B‑Thinking",     id: "THUDM/GLM-4.1V-9B-Thinking" },
  { name: "OpenAI GPT‑4",             id: "openai/gpt-4",                provider: "openai" },
  { name: "Gemini Pro",               id: "gemini/pro",                  provider: "gemini" },
  { name: "Fireworks V1",             id: "fireworks-ai/fireworks-v1",   provider: "fireworks" }
];

const LANGS = [
  "python","c","cpp","markdown","latex","json","html","css",
  "javascript","jinja2","typescript","yaml","dockerfile","shell",
  "r","sql","sql-msSQL","sql-mySQL","sql-mariaDB","sql-sqlite",
  "sql-cassandra","sql-plSQL","sql-hive","sql-pgSQL","sql-gql",
  "sql-gpSQL","sql-sparkSQL","sql-esper"
];

/* ---------- DOM ---------- */
const $              = q => document.querySelector(q);
const modelSel       = $("#model");
const langSel        = $("#language");
const promptIn       = $("#prompt");
const fileIn         = $("#reference‑file");
const websiteIn      = $("#website‑url");
const searchChk      = $("#web‑search");
const codeOut        = $("#code‑out");
const previewFrame   = $("#preview");
const histList       = $("#history‑list");
const genBtn         = $("#generate");
const clearBtn       = $("#clear");

/* ---------- populate dropdowns ---------- */
MODELS.forEach(m => {
  const opt = document.createElement("option");
  opt.value = m.id; opt.textContent = m.name; modelSel.appendChild(opt);
});
LANGS.forEach(l => {
  const opt = document.createElement("option");
  opt.value = l; opt.textContent = l.toUpperCase(); langSel.appendChild(opt);
});

/* ---------- tab logic ---------- */
document.querySelectorAll(".tabs[role=tablist]").forEach(tablist => {
  tablist.addEventListener("click", e => {
    if (e.target.getAttribute("role") !== "tab") return;
    const tabs   = tablist.querySelectorAll("[role=tab]");
    const panels = tablist.parentElement.querySelectorAll("[role=tabpanel]");
    tabs.forEach(t => t.setAttribute("aria-selected", t === e.target));
    panels.forEach(p => p.hidden = p.id !== e.target.getAttribute("aria-controls"));
  });
});

/* ---------- utilities ---------- */
const addHistory = text => {
  const li = document.createElement("li");
  li.textContent = `${new Date().toLocaleTimeString()}${text.slice(0,40)}…`;
  histList.prepend(li);
};

/* ---------- clear ---------- */
clearBtn.addEventListener("click", () => {
  promptIn.value = ""; fileIn.value = ""; websiteIn.value = "";
  codeOut.textContent = ""; previewFrame.srcdoc = ""; histList.innerHTML = "";
});

/* ---------- generate ---------- */
genBtn.addEventListener("click", async () => {
  const prompt = promptIn.value.trim();
  if (!prompt) { alert("Please provide a prompt."); return; }

  genBtn.disabled = true; genBtn.textContent = "Generating…";

  const body = {
    prompt,
    model_id    : modelSel.value,
    language    : langSel.value,
    enable_search : searchChk.checked,
    website_url : websiteIn.value || null,
    file_path   : null   // will be set below if file selected
  };

  if (fileIn.files.length) {
    // upload file via FormData so Gradio saves it and passes path
    const fd = new FormData();
    fd.append("file", fileIn.files[0]);
    const up = await fetch("/upload", { method:"POST", body: fd });
    body.file_path = (await up.json()).file;
  }

  try {
    const res  = await fetch("/run/predict", {
      method : "POST",
      headers: { "Content-Type": "application/json" },
      body   : JSON.stringify(body)
    });
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    const [code] = await res.json();              // ← Gradio returns [code, history]
    codeOut.textContent = code;
    previewFrame.srcdoc = langSel.value === "html"
      ? code
      : `<pre style="white-space:pre-wrap">${code.replace(/</g,"&lt;")}</pre>`;
    addHistory(prompt);
  } catch (err) {
    console.error(err);
    alert("Generation failed – check console.");
  } finally {
    genBtn.disabled = false; genBtn.textContent = "Generate code";
  }
});