File size: 8,577 Bytes
2c3cddc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GGUF Toolkit β€” API</title>
<meta name="description" content="The client-side GGUF API (browser JS) and the CPU suite endpoints, documented.">
<style>
  :root { --bg:#0e1117; --panel:#161b22; --line:#26303d; --fg:#e6edf3; --dim:#8b949e;
          --accent:#7c8cff; --ok:#3fb950; }
  * { box-sizing:border-box; }
  body { margin:0; background:var(--bg); color:var(--fg);
         font:15px/1.6 ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif; }
  .wrap { max-width:960px; margin:0 auto; padding:26px 22px 70px; }
  h1 { margin:0 0 6px; font-size:24px; } h2 { margin:34px 0 8px; font-size:19px; }
  h3 { margin:22px 0 6px; font-size:16px; color:var(--fg); }
  p, li { color:#c9d4e0; } .dim { color:var(--dim); }
  a { color:var(--accent); }
  pre { background:#0d1117; border:1px solid var(--line); border-radius:10px; padding:14px;
        overflow:auto; font:12.5px/1.55 ui-monospace,SFMono-Regular,Consolas,monospace; }
  code { background:#0d1117; border:1px solid var(--line); border-radius:5px; padding:1px 5px;
         font:13px ui-monospace,SFMono-Regular,Consolas,monospace; }
  table { border-collapse:collapse; width:100%; margin:10px 0; font-size:14px; }
  th, td { border:1px solid var(--line); padding:7px 10px; text-align:left; vertical-align:top; }
  th { background:var(--panel); color:var(--dim); font-weight:600; }
  .pill { display:inline-block; padding:2px 9px; border-radius:999px; font-size:12px;
          border:1px solid var(--line); color:var(--ok); }
  .note { border-left:3px solid var(--accent); padding:8px 14px; color:#c9d4e0;
          background:var(--panel); border-radius:0 8px 8px 0; }
  footer { border-top:1px solid var(--line); margin-top:34px; padding-top:14px; color:var(--dim); font-size:13px; }
</style>
</head>
<body>
<div class="wrap">
  <h1>GGUF Toolkit β€” API</h1>
  <p class="dim">Two interfaces, chosen by where the work belongs: a <b>client-side JS API</b> on this
     static Space (no server, no quota) and <b>Gradio endpoints</b> on the CPU suites for the things
     that genuinely compute. <a href="index.html">← back to the tools</a></p>

  <h2>1. Client-side JS API <span class="pill">static Β· 0 CPU</span></h2>
  <p>Load <code>gguf.js</code> with a classic script tag and parse an <code>ArrayBuffer</code>. The
     file is dependency-free and exports the same logic the Python reference does
     (<code>templates/gguf_util.py</code>); the two are kept equal by
     <code>scripts/crosscheck_gguf.py</code>, which compares them on real <code>.gguf</code> files.</p>

<pre>&lt;script src="gguf.js"&gt;&lt;/script&gt;
&lt;script&gt;
  // read only the header: the reader stops at the tensor index
  const head = file.slice(0, 64 * 1024 * 1024);
  const h = GGUF.parse(await head.arrayBuffer());
  h.sizeBytes = file.size;               // the slice is a prefix of the file

  console.log(GGUF.inspect(h));          // metadata KVs + quantisation mix
  console.log(GGUF.validate(h).verdict); // "SELF-DESCRIBING: complete" | ...
  console.log(GGUF.inventory(h, "attn", "params"));
  const json = GGUF.buildWorkflow("sdxl", "sdxl-unet-q8.gguf", "a photo", "blurry");
&lt;/script&gt;</pre>

  <table>
    <tr><th>Function</th><th>Returns</th></tr>
    <tr><td><code>GGUF.parse(arrayBuffer)</code></td><td><code>{version, nTensors, nKv, kv[], tensors[], sizeBytes}</code>; throws <code>GGUF.GgufError</code> on a bad magic/version</td></tr>
    <tr><td><code>GGUF.inspect(h)</code></td><td>text: every KV and the quantisation histogram</td></tr>
    <tr><td><code>GGUF.validate(h)</code></td><td><code>{report, verdict}</code> β€” checks the self-describing schemas (<code>sdxl</code>, <code>jinxos</code>, <code>lora</code>, <code>shader</code>, <code>jinxai</code>)</td></tr>
    <tr><td><code>GGUF.compareFromFile(h)</code> / <code>GGUF.compareFromParams(n)</code></td><td>text: size in every quantisation from the ggml bit-width table</td></tr>
    <tr><td><code>GGUF.inventory(h, filter, sortBy)</code></td><td><code>{table, hist}</code>, 400 rows max</td></tr>
    <tr><td><code>GGUF.buildWorkflow(family, unet, pos, neg)</code></td><td>ComfyUI-GGUF workflow JSON (<code>sdxl</code>, <code>flux</code>)</td></tr>
    <tr><td><code>GGUF.quantHistogram(tensors)</code>, <code>GGUF.fmtBytes(n)</code>, <code>GGUF.estimateSizes(n)</code>, <code>GGUF.GGML_TYPES</code>, <code>GGUF.BITS</code>, <code>GGUF.SCHEMAS</code></td><td>the tables and helpers the tools are built from</td></tr>
  </table>

  <h3>Loading the API into your own page</h3>
  <p class="note"><b>Static Spaces have no API endpoints.</b> They are files, served from
     <code>https://&lt;owner&gt;-&lt;name&gt;.static.hf.space/</code> β€” note the <code>.static</code>
     host, which is different from a Gradio Space's <code>.hf.space</code>. So the API is the JS file
     itself; fetch and evaluate it, or copy <code>gguf.js</code> next to your page.</p>
<pre>const src = await (await fetch(
  "https://aeuph-gguf-toolkit.static.hf.space/gguf.js")).text();
new Function(src)();                       // defines GGUF on window
const h = GGUF.parse(await file.arrayBuffer());</pre>
  <p>Because the module also does <code>module.exports = api</code> when it is loaded outside a
     browser, the same file runs in Node β€” that is how the cross-check test drives it.</p>

  <h2>2. CPU suite endpoints <span class="pill">cpu-basic Β· programmatic</span></h2>
  <p>Work that needs real compute stays on a <code>cpu-basic</code> suite and keeps its Gradio
     endpoints, callable with <code>gradio_client</code>:</p>

<pre>from gradio_client import Client

# Hyper-dimensional computing: bind / bundle / permute / lexicon / aetheric VM
h = Client("AEUPH/hdc-suite")
h.predict("aether", "cosmos", 3, api_name="/algebra")

# Quantum: statevector circuit simulation, Grover, CHSH, superposition
q = Client("AEUPH/quantum-suite")
q.predict("H 0\nCX 0 1", 2, api_name="/circuit_sim")
q.predict(5, 16, api_name="/grover")

# BRUTE-AI: same-origin relay (this is the endpoint a static page cannot offer)
b = Client("AEUPH/brute-suite")
b.predict(url, key, params_json, message, api_name="/relay")
b.predict(model_reply, api_name="/protocol_runner")</pre>

  <table>
    <tr><th>Suite</th><th>Endpoints</th><th>Why it needs CPU</th></tr>
    <tr><td><code>hdc-suite</code></td><td><code>/algebra</code>, <code>/lexicon</code>, <code>/aetheric_vm</code></td><td>1024-dimensional hypervector arithmetic β€” server-side computation</td></tr>
    <tr><td><code>quantum-suite</code></td><td><code>/circuit_sim</code>, <code>/superposition</code>, <code>/grover</code>, <code>/entanglement_lab</code></td><td>numpy statevector simulation</td></tr>
    <tr><td><code>brute-suite</code></td><td><code>/relay</code>, <code>/protocol_runner</code></td><td>same-origin relay: the browser cannot read a cross-origin model reply, so the request must leave from the host</td></tr>
  </table>

  <h3>The <code>/relay</code> contract</h3>
  <p><code>relay(url, key, params_json, message)</code> POSTs <code>params_json</code> to
     <code>url</code> with <code>Authorization: &lt;key&gt;</code> and returns the model text, the
     HTTP status and the elapsed time. The key is used once and never stored, logged or echoed back
     β€” the caller supplies their own. This is the piece BRUTE-AI could not do itself: its own
     <code>fetch</code> used <code>mode: "no-cors"</code>, so the reply was unreadable.</p>

  <h2>3. Which interface a project gets</h2>
  <table>
    <tr><th>Rule</th><th>Where it goes</th></tr>
    <tr><td>The bytes are already in the visitor's browser (they dropped a file in)</td><td>static Space, JS</td></tr>
    <tr><td>Pure arithmetic, formatting, JSON/table building</td><td>static Space, JS</td></tr>
    <tr><td>Simulation, model inference, anything with a compute stack</td><td>CPU suite, endpoints</td></tr>
    <tr><td>Needs to escape the browser sandbox (CORS, secrets held by the caller, host processes)</td><td>CPU suite, endpoints</td></tr>
  </table>
  <p class="dim">On this account a Gradio/Docker Space cannot even be created on the free tier
     (<code>POST /api/repos/create</code> β†’ HTTP 402), and only three <code>cpu-basic</code> Spaces run
     at once β€” which is what makes the static route the default rather than a preference.</p>

  <footer>Part of the AEUPH studio. See the tools at <a href="index.html">index.html</a>.</footer>
</div>
</body>
</html>